Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加到另一个原型实例的原型:JavaScript_Javascript_Prototype - Fatal编程技术网

添加到另一个原型实例的原型:JavaScript

添加到另一个原型实例的原型:JavaScript,javascript,prototype,Javascript,Prototype,我的问题很简单: 如何设置从另一个类的原型继承的类的原型 在我尝试调用Pierre.mySkill()之前,下面的代码一直有效,此时控制台表示函数未定义 理论上,我这样做的原因是能够创建Pirault的实例,以及Person的实例,并且能够添加到Pirault的原型中,而不必添加到Person的 function Person (name, age){ this.name = name; this.age = age; } Person.prototype.info = fun

我的问题很简单:

如何设置从另一个类的原型继承的类的原型

在我尝试调用Pierre.mySkill()之前,下面的代码一直有效,此时控制台表示函数未定义

理论上,我这样做的原因是能够创建Pirault的实例,以及Person的实例,并且能够添加到Pirault的原型中,而不必添加到Person的

function Person (name, age){
    this.name = name;
    this.age = age;
}

Person.prototype.info = function(){
    console.log('I am '+this.name+' and I am '+this.age+' years old.');
};

function Pirault (){
    this.skill = arguments[2];

    Person.apply(this, arguments);
}

Pirault.prototype.mySkill = function(){
    console.log('My skill is '+this.skill);
}

Pirault.prototype = Object.create(Person.prototype);
Pirault.prototype.constructor = Pirault;

var Pierre = new Pirault('Pierre', 30, 'Programming');

组织代码,以便在创建prototype对象后定义所有prototype方法。例如:

Pirault.prototype = Object.create(Person.prototype);
Pirault.prototype.constructor = Pirault;

Pirault.prototype.mySkill = function(){
    console.log('My skill is '+this.skill);
}

。目前,您在原型上正确地定义了一个方法,但当一个对象(由
object.create
创建)成为一个新的
Pirault.prototype
时,您就失去了它。作为一种替代方法,您不需要构造函数来完成此操作。在现代浏览器中,您只需要对象和
对象。创建

var Person = {
  info: function() {
    console.log('I am '+ this.name +'and I am '+ this.age +' years old.')
  }
}

var Pirault = Object.create(Person)
Pirault.mySkill = function() {
  console.log('My skill is '+ this.skill)
}

var pierre = Object.create(Pirault)
pierre.name = 'Pierre'
pierre.age = 30
pierre.skill = 'Programming'

pierre.mySkill() //=> My skill is Programming

console.log(Pirault.isPrototypeOf(pierre)) //=> true
console.log(Person.isPrototypeOf(pierre)) //=> true

那么
技能
就是
皮埃尔
?呜呜!感谢您捕捉到这一点,我想在发布之前更新它;foo.name='foo';foo={};console.log(foo.name)。很明显,为什么
foo.name
返回
undefined
。如果所有的基本对象都是“interface”(ahem),也就是说,只包含要处理的方法,那么这种方法很有效。否则,我们也必须实例化它们,在我看来,这可能会变得混乱。不过,这是一个很好的方法,+1来自我。)一千谢谢。如果我能不止一次投你一票,我会的。你无法想象我读了多少关于类/构造函数/基于新方法的文章,我总是觉得有些东西“不太正确”…实际上,组织对象层次结构的方法不止一种-例如,mixin(
Base.call(this)
)。@papiro这真是一个很长的话题,我觉得我无法在SO的回答中解释这一点(更不用说在评论中了)。不过,请注意区别:在您的例子中,您没有在
pierre
上分配属性-您只是将其传递到带有
Person.apply(这是参数)
行的基构造函数类中。按照这个答案中给出的方法,情况并非如此——在对象实例上设置属性是创建该实例的客户机的责任。@papiro我可以推荐您阅读Addy Osmani吗?在我看来,它很好地解释了JS中不同创作模式的差异和潜在用例。)