原型内部的Javascript对象
Javascript Objects Inside Prototype
在学习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)改变了原型本身上对象的值,因为它继承了一个对象(特性),而不是基元。
我的问题如下:原型在大多数时候都是用来保存原语的吗?(在大多数情况下,您永远不希望实例更改原型的值。Angular.js实际上是这样做的,但在极少数情况下,实际上您希望子实例写入原型)。如果你真的想把一个对象放在原型上,而没有实例在分配时写入原型,你会怎么做?
这实际上与prototype
无关,只是一种通用的JS行为。
解决方案是从构造函数中的原型复制对象
function Person() {
this.characteristics = angular.copy(this.characteristics);
}
Person.prototype = { whatever };
以上假设角度可用于angular.copy
函数。否则,您将需要通过迭代属性并复制到新属性中来手动复制对象。
要获得您期望的行为,请尝试以下操作:
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基于原型的继承及其工作方式有关。
你可能想看看这篇关于原型继承的文章
您可能还想查看__proto__
与原型的SO问题。
相关文章:
- 面向对象JavaScript中的私有函数
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 将字符串转换为对象 javascript/jquery
- 正在检查对象javascript中是否存在嵌套属性
- 时间-日期对象JavaScript getUTCMilliseconds
- 仅在对象(javascript)中解析值
- 使用对象(JavaScript或jQuery)填充选择下拉列表
- 引用另一个对象javascript中的对象
- 如何删除列表中的对象?Javascript nodejs和下划线
- 无法从日期对象javascript获取日期和月份
- 如何在if语句中使用对象-Javascript
- 对象javascript错误
- 对象Javascript的少数实例
- 位置对象Javascript
- 将字符串传递到对象javascript中
- 获取对象Javascript或jQuery的最后一个值
- 鼠标接近对象Javascript
- 这个mixins代码是书中的错误吗;面向对象JavaScript的原理”;
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 访问对象javascript数组中的对象属性值