如何调用构造函数原型的基本方法,并使用与类中的方法相同的名称?

时间:2017-01-20 22:00:08

标签: javascript

鉴于我有:

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?

3 个答案:

答案 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属性。
在您的情况下,counstructorPerson函数对象。
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)