十二 原型链
Grand.prototype.lastName = "Deng";
function Grand ( ) { }
var grand = new Grand ( );
Father.prototype = grand;
function Father ( ) { this.name = "xuming"; }
var father = new Father ( ) ;
Son.prototype = father;
function Son ( ) { this.hobbit = "smoke"; }
var son = new Son ( ) ;
// son.lastName = "Deng"
在原型上再加一个原型,按照链的形式访问属性或者方法的形式,叫做原型链,链接点为 __proto__;
son上面没有toString方法,访问的是Object的toString;
以此原型链为例 Grand.prototype.__proto__ = Object.prototype; Object是终极boss,它的下面不再有__proto__指向。
增删改查:子孙不能修改祖先的东西。但是有特例。
特例:son.父级的属性或方法.属性。此时son是不改的,但是父级或者说祖先会有改变
这是引用值自己的修改,只适用于引用值,原始值不可以。
var obj = { } 等价于 var obj = new Object ( ) ;
obj.__proto__ ---> Object.prototype
Object.create(原型)
// var obj = Object.create ( 原型 ); 括号里只能填原型(对象)或者null,不能为空
Person.prototype.name = "sunny";
function Person ( ) { }
var person = Object.create ( Person.prototype );
绝大多数对象最终都会继承自Object.prototype
特例!!!!
Object.create ( null ); 这样创建出来的原型下面没有__proto__,即使手动加了也没有继承特性
null 和 undefined 是原始值,既不是对象,也没有原型,所以它们没有toString ( ) 方法,undefined是原始值
avaScript中的数据类型分为两类,原始类型(primitive type)和对象类型(object type)。JavaScript中的原始类型包括:数字,布尔值,字符串,以及null和undefined。
原型上方法的重写
Object.prototype.toString 与 Number.prototype.toString 是方法重写的关系
Object.prototype.toString.call( 123 ); // "[object Number]"
Object.prototype.toString.call( true ); // "[object Boolean]"
var obj = Object.create ( null );
document.write ( obj ) ; //此处其实是打印的obj.toString ( )
如果给obj增加一个toString方法, obj.toStirng = function ( ) { return "其实是打印toString啦"; }
document.write( obj ); 就会打印出 toString方法中return的东西