【发布时间】:2012-10-07 00:23:23
【问题描述】:
您如何处理在其子级之间共享原型的引用属性的问题?是否有任何众所周知的模式(除了在构造函数中重新定义属性)来解决这个问题?这是一个问题,还是我缺少关于原型继承的一些东西?
例子:
var dog =
{
name: "no-name",
paws: ["front-right", "front-left", "back-right", "back-left"]
};
var rex = Object.create(dog);
rex.name = "Rex";
var bingo = Object.create(dog);
bingo.name = "Bingo";
bingo.paws.pop(); //Bingo is just like a dog, but has lost a paw in a tragic accident
console.log(bingo.paws); //["front-right", "front-left", "back-right"]
console.log(rex.paws); //Rex lost a paw too! ["front-right", "front-left", "back-right"]
更新:
在研究了原型继承之后,在我看来,这种范式中“自然”的编程方式是扩展对象,而不是在将它们用作“类”的意义上过多依赖构造函数。我在博客上看到的示例(而且它似乎也与 Douglas Crockford 的Object.create 一致)或多或少是这样的:
var Dog =
{
name: "no-name",
paws: ["front-right", "front-left", "back-right", "back-left"],
bark: function() { alert("Bark!!"); }
};
//No constructor acting like a "class"
var BigDog = Object.create(Dog);
BigDog.bark = function() { alert("WOLF!!!"); };
var thor = Object.create(BigDog);
thor.name = "Thor";
thor.bark();
构造函数是在新实例上复制或创建新数组的唯一方法吗? Object.create这个模式是不是“不完整”?
感谢您的回答!
【问题讨论】:
-
创建一个构造方法,返回一个带有数组副本的完全限定对象。
-
引用类型会有这个问题。您只需要以某种方式手动将引用类型直接放在对象上而不是原型上。
-
这里的学习总是把函数放在原型对象中,把属性(每个实例可能有单独的副本)放在构造函数中。
标签: javascript prototype design-patterns object-create