javascript原型共享

时间:2016-12-08 05:41:41

标签: javascript prototype

我想学习如何在javascript中使用原型,我知道原型可以帮助我例如在许多对象之间共享函数

var car = function(color, speed) {
    this.color = color;
    this.speed = speed;
}
car.prototype.doors = 4;
var honda = new car('black', 'beep');
var kea = new car('black', 'meep');
document.write(kea.doors+' '+ honda.doors);
honda.doors = 2;
document.write('<br/>');
document.write(kea.doors+' '+ honda.doors);
car.prototype.doors = 4;
document.write('<br/>');
document.write(kea.doors+' '+ honda.doors);

我在这里看了一段视频:Here

那家伙说,如果我更新原型的值,那么变量将在我的所有对象中改变但是在我的例子中,当我改变它时,值没有改变。 如果我错了,请纠正我。

4 个答案:

答案 0 :(得分:4)

它们仅针对未明确更改此属性的对象进行更改。我在最后一步更改了代码以设置5个门:

car.prototype.doors = 5;

https://jsfiddle.net/g1hrujL0/ 在那里,您可以看到kea对象的门数发生了变化,从而继承了原型中的值,但是由于我们已经为honda对象显式更改了此属性,因此其值不会更改。

答案 1 :(得分:1)

JavaScript对象是引用类型,而像Numbers这样的基元则不是。所以你要使用副本。当您更改honda.doors的值时,您不会在其他任何位置更改它。要解决此问题,您可以将car.prototype.doors作为对象放置,例如car.prototype.doors = {doors: 4};

答案 2 :(得分:1)

您编写的代码与此类似。如果您打开chrome dev工具,则可以进行验证。当你寻找honda.doors时,它会在找到4之前找到2。

car:{
    color: "black",
    doors: 2,
    speed:"beep",
    __proto__: {
        constructor: function(color, speed),
        doors:4,
        __proto__: {}
    }   
}

答案 3 :(得分:1)

@Ben答案的进一步补充(它们只会更改未明确更改此属性的对象)这与删除相同如果删除当前对象属性(删除honda.doors;)然后引用它,它将获取原型属性Value。当当前对象没有该属性时调用Prototype,否则它总是引用本机属性值我希望这有助于理解原型

考虑这段代码

&#13;
&#13;
var car = function(color, speed) {
    this.color = color;
    this.speed = speed;
}
car.prototype.doors = 4;
var honda = new car('black', 'beep');
var kea = new car('black', 'meep');
console.log(kea.doors+' '+ honda.doors);
honda.doors = 2;
console.log('<br/>');
console.log(kea.doors+' '+ honda.doors);
car.prototype.doors = 4;
delete honda.doors;
console.log('<br/>');
console.log(kea.doors+' '+ honda.doors);
&#13;
&#13;
&#13;