gpt4 book ai didi

javascript - Object.create 和引用属性

转载 作者:行者123 更新时间:2023-11-29 10:20:34 25 4
gpt4 key购买 nike

您如何处理在其子项之间共享原型(prototype)引用属性的问题?是否有任何众所周知的模式(除了在构造函数中重新定义属性)来解决这个问题?这到底是一个问题,还是我遗漏了一些关于原型(prototype)继承的东西?

例子:

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"]


更新:

在研究了原型(prototype)继承之后,在我看来,在这种范式中编程的“自然”方式是通过扩展对象,而不是在将它们用作“类”的意义上过分依赖构造函数。我在博客上看到的示例(它似乎也与 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 的这种模式是否“不完整”?

感谢您的回答!

最佳答案

如您所知,对象的原型(prototype)是包含构成该对象的基本属性的对象。与所有对象一样,该原型(prototype)对象是名称到值的映射。 javascript 中的数组(和对象)总是通过引用传递,因此当在原型(prototype)上调用 Object.create 时 - 它只是将数组的引用复制到新对象中。正如 TheZ 在他的评论中所说,你可以这样做:

function Dog(){
this.paws = ['front-right', 'front-left', 'back-right', 'back-left'];
}
Dog.prototype = {
name: 'no-name',
paws: null
};

现在我们可以创建我们的对象了:

var rex = new Dog();
rex.name = 'Rex';

var bingo = new Dog();
bingo.name = 'Bingo';
bingo.paws.pop();

关于javascript - Object.create 和引用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com