【问题标题】:prototypical inheritance javascript原型继承javascript
【发布时间】:2018-02-21 11:46:50
【问题描述】:

来自 Java 背景,Javascript 是我试图掌握的一个新世界。
我有点为原型继承的工作原理而苦苦挣扎。
我从__proto__ VS. prototype in JavaScript 和其他来源获得的信息很有帮助,但我真的想确保我掌握了这个主题。以下说法对吗?

__proto__,对象的属性,是表示对象原型的对象。该对象反过来也可以具有__proto__ 属性,直到对象对象到达链的末端。

prototype是函数对象的一个​​属性,也是一个对象本身。当使用new 关键字从函数实例化对象时,该新实例的__proto__ 将是构造函数的prototype 属性。例如:

let random =  new Array();

console.log(random.__proto__);   //logs the object which is the prototype of random
console.log(Array.prototype);    //logs the same object as random.__proto__

console.log(random.__proto__.__proto__);  // logs the Object prototype object
console.log(Object.prototype);        // logs the same object as random.__proto__.__proto__

此外,当对象相互测试是否相等时,它们在以下代码中是同一个对象:

console.log(random.__proto__ === Array.prototype);               // logs true
console.log(random.__proto__.__proto__ === Object.prototype );   // logs true

由于通过引用测试对象是否相等,这是否意味着实际上存在 Object.prototype 对象的一个​​实例,并且所有对象 __proto__ 都引用此实例?

提前致谢。

【问题讨论】:

  • 是的,由单个构造函数构造的所有对象共享其单个原型对象。如果原型在某些对象被构建后发生变化,那就不再正确了:旧对象将继续引用旧原型。当然,这将是一件奇怪的事情,而且可能是坏事。
  • 是的,是的,是的;))
  • 是的。你是对的,稍作修正。 “直到 Object 对象,到达链的末尾。” 实际上,Object.prototype 是行的末尾。
  • 好的,非常感谢!
  • 吹毛求疵:原型链的末端可以是任何对象,对象只是通常的对象。链的真正末端是空值。

标签: javascript inheritance prototype proto


【解决方案1】:

如果你使用 console.log(typeof(Ojbect)) 和 console.log(typeof(Array)) 你得到了一个“函数” 所有不是原始类型(未定义、null ...)的都是对象或 JavaScript 中的“实例”,意味着函数继承自对象。

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多