原型中的Javascript对象

原型中的Javascript对象,javascript,angularjs,Javascript,Angularjs,在学习angularjs时,我发现如果将对象放在原型对象中,从该原型继承的实例将在指定时更改原型的对象 例如: function Person(name) {this.name = name;} Person.prototype = {species : "homo-sapiens" , characteristics : { "legs" : 2 , "height" : 175}} var joe = new Person("joe"); joe.characteristics.legs

在学习angularjs时,我发现如果将对象放在原型对象中,从该原型继承的实例将在指定时更改原型的对象

例如:

function Person(name) {this.name = name;}
Person.prototype = {species : "homo-sapiens" , characteristics : { "legs" : 2 , "height" : 175}}
var joe = new Person("joe"); 
joe.characteristics.legs = 1 ; 
console.log(Person.prototype.characteristics) //Object {legs: 1, height: 175}
我展示的是原型的实例joe改变了原型本身上对象的值,因为它继承了对象特征而不是原语


我的问题如下:原型是否意味着大部分时间都用来保存原语?在大多数情况下,您永远不会希望实例更改原型的值。js实际上是这样做的,但在很少的情况下,您实际上希望一个子实例写入原型。如果你真的想把一个对象放在原型上,而不让实例在赋值时写入原型,你会怎么做

这实际上与原型无关,只是一个一般的JS行为

解决方案是从构造函数中的原型复制对象

function Person() {
    this.characteristics = angular.copy(this.characteristics);
}

Person.prototype = { whatever };

以上假设angular.copy函数可以使用angular。否则,您需要通过迭代属性并复制到新的属性中来手动复制对象。

要获得预期的行为,请尝试以下操作:

function Person(name) {
    this.name = name;
    this.species = "homo-sapiens";  
    this.characteristics = { "legs" : 2 , "height" : 175};
}
// NOTE: line below is no longer needed, but I'm keeping it 
// here just so you can see its output for comparison below
Person.prototype = {species : "homo-sapiens", 
                    characteristics : { "legs" : 2 , "height" : 175}}

var joe = new Person("joe"); 

joe.species = "regular old joe"; 
console.log('Person.prototype.species:', Person.prototype.species); 
// Line above prints: Person.prototype.species: homo-sapiens
console.log('joe.species:', joe.species); 
//joe.species: regular old joe

joe.characteristics.legs = 1 ; 
console.log('Person.prototype.characteristics:', Person.prototype.characteristics); 
//Person.prototype.characteristics: Object {legs: 2, height: 175}
console.log('joe.characteristics:', joe.characteristics); 
//joe.characteristics: Object {legs: 1, height: 175} 
澄清一下,您的问题实际上与angular无关,它只与javascript基于原型的继承以及它的工作方式有关

你可能想结账

您可能还想。

大多数提供类的框架都提供了将原型上的原语克隆到类的每个实例的方法。如果需要,您可能需要为类创建包装函数