javascript|[[Prototype]] ——原型链两万字全面解析「建议收藏」(13)



关联的威力:
var anotherObject = {
  cool: function() {
    console.log( 'cool' )
  


var myObject = Object.create( anotherObject )

myObject.doCool = function() {
  this.cool() // 内部委托

myObject.doCool() // cool

这里我们调用的 myObject.doCool() 实际上存在于 myObject 中 , 这可以让我们 Api 设计更加清晰 。 从内部来讲 , 我们的实现遵循的是委托设计模式 , 通过 [[Prototype

委托到 anotherObject.cool()
换句话说 , 内部委托比起直接委托可以让 API 接口设计更加清晰 。


好像确实看起来更好一点
小结如果要访问对象中不存在的一个属性 ,[[Get

操作就会查找对象内部 [[Prototype

关联的对象 。 这个关联关系实际上定义了一条「原型链」 , 在查找属性时会对它进行遍历 。

层层往上 。
所有普通对象都有内置的 Object.prototype , 指向原型链的顶端 , 如果在原型链中找不到找不到指定的属性就会停止 。toString()、valueOf() 和其他的一些通用的功能都存在于 Object.prototype 对象上 , 因此语言中所有的对象都可以使用它们 。

最外层是 Object.prototype
关联两个对象最常用的方法是使用 new 关键字进行函数调用 , 在调用的 4 个步骤中会创建一个关联其他对象的新对象 。
使用 new 调用函数时会把新对象的 .prototype 属性关联到「其他对象」 。 带 new 的函数调用通常被称为「构造函数调用」 , 尽管它们实际上和传统面向类语言中的类构造函数不一样 。
虽然这些 JavaScript 机制和传统面向类语言中的「类初始化」和「类继承」很相似 , 但是 JavaScript 中的机制有一个核心区别 , 那就是不会进行复制 , 对象之间是通过内部的 [[Prototype

链关联的 。
出于各种理由 , 以「继承」结尾的术语和其他面向对象的术语都无法帮助理解 JavaScript 真实机制 。
相比之下 , 「委托」是一个更合适的术语 , 因为对象之间的关系不是复制而是委托 。

【javascript|[[Prototype]] ——原型链两万字全面解析「建议收藏」】JavaScript 这门语言充满看似 , 实际上并没有继承 , 所有的继承都是委托假装出来的样子 。