在没有初始原型的情况下在对象上设置__proto__

时间:2016-09-30 15:50:17

标签: javascript prototype

让我们创建新对象,然后更改其原型:

#rectsearchresults{
    position: relative;
    margin-top: -10px;
    margin-left: -0px;
    background: #ffffff;
    padding-left: 20px;
    padding-right: 20px;
    padding-bottom: 20px;
    padding-top: 20px;
    width:916px;

}
#result{
    margin-bottom: 20px;
}
#resultheader{
    margin-left:10px;
    color:black;
    font-size: 15px;
    margin-top: -20px;
}

我们看到var obj = new Object; obj.__proto__ = new Date; obj.setTime // is a function 现在从其新原型obj继承属性。

然后,我们创建新对象不带原型并更改其原型:

new Date

我们发现原型链不起作用 - var obj = Object.create(null); obj.__proto__ = new Date; obj.setTime // undefined 未继承obj的属性,即使其new Date__proto__

为什么?

(我想这是因为new DateObject属性的setter中有一些内部逻辑,但不确定

2 个答案:

答案 0 :(得分:1)

当我们需要显式访问/修改对象的原型时,这是__proto__Object.getPrototypeOf() / Object.setPrototypeOf()之间的一个细微差别。

这是我说服自己应该Object.setPrototypeOf()Object.getPrototypeOf()代替__proto__的原因之一。

var o = Object.create(null);
Object.setPrototypeOf(o, new Date());
console.log(o.setTime)

答案 1 :(得分:0)

执行var obj = Object.create(null);时,您创建的对象没有__proto__

在一行一行中,您只需创建一个名为__proto__的字段,如果仔细观察该字段本身将有一个名为__proto__的内部字段。

您可以使用任何名称创建任何字段。在您的情况下,您选择__proto__作为字段的名称。它可能是任何东西。