JavaScript中的原型继承、对象系统、函数式语言特性

原型与普通对象--"new Object()"创建的实例并没有区别,所有对象(构造器对象,原型对象,普通对象)都有constructor属性。实例对象至少应该拥有指向原型的proto属性,这是JavaScript中的对象系统的基础。不过这个属性是不可见的,我们称之为“内部原型链”。但我们可以通过实例对象的costructor属性来找到构造器,并进而找到它的原型。
function aa() {}
aa.constructor === Object.constructor // true
new aa().constructor.prototype === aa.prototype // true

回溯原型链:

function MyObject() {}
function MyObjectEX() {}
如果想要MyObjectEX原型继承MyObject,办法是设置:
MyObjectEX.prototype = new MyObject()
但是这样会导致原型的构造器值出现偏差,即 
MyObjectEX.prototype.constructor = MyObject.prototype.constructor
导致MyObject和MyObjectEX两个不同构造器产生的实例,它们的constructor属性却指向了相同的构造器。
问题出在我们给MyObjectEX赋值一个原型时,应该“修正”该原型的构造器值。
方法1:直接构建原型链
MyObjectEX.prototype = new MyObject()
MyObjectEX.prototype.constructor = MyObjectEX
但这又会引出新的问题,.constructor应该指向MyObject()构造器,方法1便不能满足。
方法2:在子类构造器函数内初始化实例的构造器属性
function MyObjectEX() {
  this.constructor = MyObjectEX
}
这样一来,MyObjectEX构造的实例的constructor属性都正确地指向MyObjectEX(),而原型的constructor则指向MyObject()。虽然你会发现它的效率较低,因为每次构造实例时都要重写constructor属性,但它是唯一有效的方法。
没办法,如果你不需要回溯原型链,那么可以用第一种方法,否则得按第二种方法来。

new MyObject()时执行了什么?

参考书籍《JavaScript语言精髓与编程实践》第2版 P157-P220

你可能感兴趣的:(javascript)