组合已经拥有自己属性的方法(使用原型属性)

时间:2014-10-25 02:08:14

标签: javascript prototype

我有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搜索结果第一页上的所有内容,而且我从未见过正确类型的示例

编辑:我不想复制属性,因为我正在开发游戏而且我不希望这些更改是永久性的。让我们说samhuman原型,但在游戏中的任何一分钟,他的原型都可以改为zombie或其他。

1 个答案:

答案 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