gpt4 book ai didi

javascript - 哪些原型(prototype)属性在实例之间共享

转载 作者:行者123 更新时间:2023-11-30 17:34:28 25 4
gpt4 key购买 nike

http://jsfiddle.net/F5ZSA/1/

这是上面 fiddle 的代码:

"use strict";

function Human()
{
this.myname;
this.things = [];
this.addThing = function(string)
{
this.things.push(string);
}

this.getThings = function()
{
return this.things;
}

this.setName = function(name)
{
this.myname = name;
}

this.getName = function()
{
return this.myname;
}
}

Mister.prototype = new Human();
function Mister()
{

}

var mister1 = new Mister();
var mister2 = new Mister();

mister1.setName("Peter");
mister2.setName("Steven");

mister1.addThing("mister1 reporting");
mister2.addThing("mister 2 reporting");

console.log(mister1.getName());
console.log(mister2.getName());
console.log(mister1.getThings());
console.log(mister2.getThings());

当您运行它时,结果表明每个 Mister 实例的“myname”属性都不同,而“things”属性似乎在所有实例之间共享。它应该是那样的吗?如果是,说明哪些原型(prototype)属性在“继承”对象之间共享的一般规则是什么?

来自其他 OOP 语言,我的直觉是每个对象都应该有一个单独的原型(prototype)实例。尝试在 js 中强制执行它是个好主意吗?

最佳答案

这是来自传统 OOP 语言的经典问题。通过创建新对象,原型(prototype)被复制。关键字“this”已经引用了新对象,但是从原型(prototype)中引用另一个对象作为你的 this.things 仍然引用内存中的相同空间。当您创建两个对象时,您创建了对同一对象(在本例中为数组)的两个引用

以下将按您预期的那样工作。为了解决“这个”问题,我将调用的 init 方法放在那里以初始化对象,在本例中创建多个数组对象,每个对象用于新对象 Mister。

var Human = function()
{

this.myname;
this.things;
this.things;

return {
addThing:function(string)
{
this.things.push(string);
},

getThings:function()
{
return this.things;
},

setName: function(name)
{
this.myname = name;
},

getName: function()
{
return this.myname;
},
init: function(){
this.things = new Array();
}
}

}


var Mister = function(){}
Mister.prototype = new Human();

var mister1 = new Mister();
var mister2 = Object.create(Mister.prototype);
mister1.init();
mister2.init();


mister1.setName("Peter");
mister2.setName("Steven");

mister1.addThing("mister1 reporting");
mister2.addThing("mister 2 reporting");

console.log(mister1.getName());
console.log(mister2.getName());
console.log(mister1.getThings());
console.log(mister2.getThings());

关于javascript - 哪些原型(prototype)属性在实例之间共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22330043/

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