我有2个对象,人和 sam ,每个都有2个给定的属性
var human = {
legs: 2,
group: "mammal"
}
var sam = {
age: 23,
married: true
}
我可以将人对象附加到 sam 的原型中,以便将 human 的属性委托给山姆,山姆对象保持不变。
所需结果:
console.log(sam.legs); //=> 2
我知道的一种方式(但我知道"不良做法")是使用__proto__
属性:
var sam = {
age: 23,
married: true,
__proto__: human // *NOT IDEAL*
}
或的
sam.__proto__ = human; // *NOT IDEAL*
我知道Object.create()
但我不知道如何在不删除已经存储在 sam 变量中的所有内容的情况下实现它
var human = {
legs: 2,
group: "mammal"
}
var sam = {
age: 23,
married: true
}
sam = Object.create(human);
console.log(sam.age); //=> undefined
我知道我可以将人类对象首先附加到 sam ,然后将属性分配给 sam :
var human = {
legs: 2,
group: "mammal"
}
var sam = Object.create(human);
sam.age = 23;
married: true;
...但我的问题的重点是,如果我使用prototype属性附加了两个已经拥有自己属性的对象?我能以一种我不知道的方式使用Object.create()吗?
我必须阅读object.create()
的Google搜索结果第一页上的所有内容,而且我从未见过正确类型的示例
编辑:我不想复制属性,因为我正在开发游戏而且我不希望这些更改是永久性的。让我们说sam
有human
原型,但在游戏中的任何一分钟,他的原型都可以改为zombie
或其他。
答案 0 :(得分:0)
您可以尝试构造函数并将实例转换为其他内容。
定义以人类或僵尸为构造函数参数的人类和僵尸类型。
function Human(obj){
obj = obj || {};
this.legs = obj.legs === 0 ? 0 :
obj.legs || 2;//defaults to 2
this.name = obj.name || 'nameless';
this.dead = false;
}
Human.prototype.saySomething = function(){
console.log('Hello, I\'m ' + this.name);
};
//other functions of Human
function Zombie(obj){
//Zombie is a Human but it's dead
// re use Human constructor
Human.call(this,obj);
//re set the parameters that differ from Human
this.dead = true;
//add Zombie specific parameters if needed
}
//inherit prototype from Human
Zombie.prototype = Object.create(Human.prototype);
//repair constructor
Zombie.prototype.constructor=Zombie;
//override saySomething
Zombie.prototype.saySomething = function(){
console.log('Huarrrghhh');
}
var ben = new Human({name:'ben'});
ben.saySomething();
console.log(ben);
// now ben becomes a Zombie
ben = new Zombie(ben);
ben.saySomething();
console.log(ben);
您可以尝试不同的工厂功能:
Human.toZombie = function(human){
return new Zombie(human);
}
var ben = new Human();
ben = Human.toZombie(ben);
有关构造函数和原型的更多信息:https://stackoverflow.com/a/16063711/1641941