javascript - 对象不遍历其原型(prototype)链以获取值的任何情况?

标签 javascript prototype proto object-create prototype-chain

正如我们所知,当我们试图访问一个对象的属性时,它首先会检查该对象是否有自己的属性。如果没有找到,则遍历原型(prototype)并检查,依此类推原型(prototype)链。

问题来了,请检查下面的代码片段( http://jsbin.com/mabajidoti/edit?js,console )

function CT() {}
CT.prototype.myValue = 4;
var myObj = Object.create(CT);

console.log(myObj.myValue);          //logs undefined
console.log(myObj.prototype.myValue) //logs 4

从上面的代码片段中,第一个 console.log 语句 myObj.myValue 返回未定义,即使 myValue 在其原型(prototype)中可用(第二个 console.log 语句)?它不应该遍历原型(prototype)链来获取 myValue 的值吗?

最佳答案

你好像搞糊涂了Object.create()通过 new operator 调用构造函数.

如果你说:

var myObj = new CT();

然后您的myObj 将链接到CT.prototype,因此myObj.myValue 将是4

但通过使用 Object.create(CT),您已经创建了一个新对象,其原型(prototype)是 CT 函数本身。所以 CT.prototype 不是新对象原型(prototype)链的一部分。请注意,CT.prototype 不在 CT 的原型(prototype)链中,而是指定对象,该对象将作为使用 new CT( )

更正确地使用 Object.create() 以允许从原型(prototype)访问 myValue 属性是:

var CT = {
  myValue : 4
};
var myObj = Object.create(CT);
console.log(myObj.myValue);          //logs 4

或者使用你现有的 CT() 函数和 CT.prototype 你可以说:

myObj = Object.create(CT.prototype);

关于javascript - 对象不遍历其原型(prototype)链以获取值的任何情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47107820/

相关文章:

javascript - react js : Error: useLocation() may be used only in the context of a <Router> component

javascript - 当按下向上箭头键时,将文本光标发送到文本框焦点的末尾

coffeescript - 有没有一种方法可以以更像 CoffeeScript 的方式扩展原型(prototype)?

javascript - JS中使用OOP的几种格式

go - 我应该如何使用 protoc-gen-go-grpc?

go - 原型(prototype)请求中枚举的输入验证

javascript - 在 Javascript 中将 Math.exp() 与 BigDecimal 一起用于大型 float

javascript - 如何在移动设备上使用 jQuery onload 更改文本?

Prototype 构造函数上下文中的 JavaScript 类型检查和异常?

javascript - 函数与函数的关系