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



原来你知道啊 。 现在说的这些东西 , 有几个能用上???除非刻意去用 。。
我们只有在一些特殊情况下需要设置默认 .prototype 对象的 [[Prototype

, 让它引用其他对象 。 这样可以避免使用全新的对象替换默认对象 。 此外 , 最好把 [[Prototype

对象关联看作是只读特性 , 从而增加代码的可读性 。
对象关联现在我们知道了 ,[[Prototype

机制就是存在于对象中的一个内部链接 , 它会引用其他对象 。
通常来说 , 这个链接的作用是:如果在对象上内部没有找到需要的属性或者方法引用 , 引擎就会继续在 [[Prototype

关联的对象上进行查找 。 同理 , 如果在后者中也没有找到需要的引用就会继续查找它的 [[Prototype

, 以此类推 。 这一一系列对象的链接称为「原型链」 。

对 , 原型链就是这么个东西 。
创建关联我们已经明白了为什么 JavaScript 的 [[Prototype

机制和类不一样 , 也明白了它如何建立对象间的关联 。
那么 [[Prototype

机制的意义是什么呢?为什么 JavaScript 开发者费这么大力气在代码中这些关联呢?

就目前为止 , 并不清楚原型的用处是什么 , 只知道它是什么 , 怎么形成的 。
还记得吗 , 本章前面曾经说过 Object.create(..) 是一个大英雄 , 现在是时候来弄明白为什么了:
var foo = {
    something: function() {
        console.log( 'tell me something' )
    


var bar = Object.create( foo )
bar.something() // 'tell me something'

Object.create(..) 会创建一个新对象并把它关联到我们指定的对象 , 这样我们就可以充分发挥 [[Prototype

机制的威力并且避免不必要的麻烦 , 比如使用 new 的构造函数会生成 .prototype 和 .constructor 引用 。

这里的 new 应该指的是 new bar()
我们并不需要来创建两个对象之间的关系 , 只需要通过委托关联对象就足够了 。 而 Object.create(..) 不包含任何「类的诡计」 , 所以它可以完美地创建我们想要的关联关系 。
关联关系是否备用看起来对象之间的关联关系是处理「缺失」属性或者方法的一种备用选项 。 这个说法有点道理 , 但是我认为这不是 [[Prototype

的本质 。
var anotherObject = {
  cool: function() {
    console.log( 'cool' )
  


var myObject = Object.create( anotherObject )
myObject.cool() // 'cool'

由于存在 [[Prototype

机制 , 这段代码可以正常工作 。 但是如果你这样写只是为了让 myObject 在无法处理属性或者方法时使用被用的 anotherObject , 那么你的软件就会变得有点「神奇」 , 而且很难理解和维护 。
这并不是说任何情况都不应该选择备用这种设计模式 , 但是这在 JavaScript 中并不是不是很常见 。 所以如果你使用的是这种模式 , 那或许应该退后一步并重新思考一下这种模式是否适用 。
当你给开发设计软件时 , 假设要调用 myObject.cool() , myObject 中不存于 cool() 时这条语句也正常工作的话 , 那你的 API 设计就会变得很「神奇」 , 对于未来维护你软件的开发者来说这可能不太好理解 。
但是你可以让你的 API 设计不那么「神奇」 , 同时仍能发挥 [[Prototype