鉴于我有:
var PersonClass = function () {
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.name = function(){
return this.firstName + " " + this.lastName;
};
this.setName = function(a,b){
this.firstName = a;
this.lastName = b;
return this.firstName + " " + this.lastName;
}
}
Person.prototype.name = function () {
return "Proto_:"+this.firstName + " " + this.lastName;
};
Person.prototype.whoAreYou = function () {
return "Hi i'm " + this.name();
};
Person.prototype.setName2 = function(a,b){
this.firstName = a;
this.lastName = b;
};
return Person;
}(); //PersonClass
我创建了一个实例: 我=新的PersonClass(" Steve"," Benj"); me.name()//返回Steve Benj。 什么会调用原型名称方法并返回Proto_:Steve Benj?
答案 0 :(得分:1)
Person构造函数中定义的函数将覆盖/覆盖在其下面发生的原型定义,因此没有好的方法可以在构造函数中定义的函数上调用prototyped函数(请参阅帖子中关于“bad”的评论“ 办法)。
我会考虑是否要对这两个函数使用相同的名称,除非这不是您的实际用例。我想你会想要创建一个名为protoName的原型函数或类似的东西,如果你想要不同的行为,你应该定义不同的函数。
答案 1 :(得分:0)
您构建此方法的方法是,在定义后立即调用PersonClass
函数。
所以PersonClass === Person
。
所以当你Me = new PersonClass("Steve","Benj");
时,你真正做的是Me = new Person('Steve', 'Benj');
因此,无论何时调用这些原型方法,都要从Person
调用原型方法。
您可以通过执行
来验证这一点Me.constructor // => Person
答案 2 :(得分:0)
对象与其原型之间的关系来自constructor
属性。
在您的情况下,counstructor
是Person
函数对象。
Person
与其prototype
有直接联系。
最后一件事是在某个对象上调用原型方法来正确绑定this
关键字 - 这可以通过Function.prototype.call()方法实现:
console.log(Me.constructor.prototype.name.call(Me));
输出将是:
Proto_:Steve Benj
替代方法是使用Object.getPrototypeOf(x)函数,它会产生相同的结果:
Object.getPrototypeOf(Me).name.call(Me)