JavaScript 对象之间关系图
- 所有的实例继承构造函数的prototye对象。
- 构造函数的prototype指向的对象的constructor属性默认指回原型属性对应的函数。 可以重新设置prototypede指向自定义对象,那么同时需要手动设置prototype的constructor属性,来保留原型属性对象的其他的默认操作。
function foo() { } ; var f1 = new foo();
f1.constructor === foo.prototype.constructor === foo
//replace the default prototype object
foo.prototype = new Object();
//create another instance l
f1 = new foo();
//now we have:
f1.constructor === foo.prototype.constructor === Object
//so now we say:
foo.prototype.constructor = foo
//all is well again
f1.constructor === foo.prototype.constructor === foo
- 每个prototype对象本身是由构造器Object创建的,因此所有实例都继承了Object.prototype属性。
- 读取对象属性时从原型链上依次向上查找,给对象设置属性时设置的对象本身。在原型上修改属性,会影响到所有实例对象。
function foo() { }
f1 = new foo();
f2 = new foo();
foo.prototype.x = "hello";
f1.x => "hello"
f2.x => "hello";
f1.x = "goodbye"; //setting f1.x hides foo.prototype.x
f1.x => "goodbye" //hides "hello" for f1 only
f2.x => "hello"
delete f1.x
f1.x => "hello"; //foo.prototype.x is visible again to f1.
foo.prototype.x = "goodbye";
//now
f1.x => "goodbye"
f2.x => "goodbye";
- Function.proto 指向Function.prototype,即Function.constructor === Function,也就是说Function的构造器是它自己。
参考文献