Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 - Fatal编程技术网

Javascript 如何调用构造函数的基方法';与类中的方法同名的原型?

Javascript 如何调用构造函数的基方法';与类中的方法同名的原型?,javascript,Javascript,鉴于我已: var PersonClass = function () { function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; this.name = function(){ return this.firstName + " " + this.lastName; }

鉴于我已:

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
我创建了一个实例: Me=新人班(“Steve”、“Benj”); me.name()//返回Steve Benj。
什么将调用prototype name方法并返回Proto:Steve Benj?

按照您构建它的方式,您在定义后立即调用了
PersonClass
函数

所以
PersonClass==Person

所以当你做
Me=newpersonclass(“史蒂夫”、“本杰”),你真正做的是
Me=newperson('Steve','Benj')

因此,无论何时调用这些原型方法,都是从
Person
调用原型方法

您可以通过执行以下操作来验证这一点

Me.constructor // => Person

对象与其原型之间的关系是通过
构造函数
属性实现的
在您的例子中,
constructor
Person
函数对象
与其
原型
直接耦合
最后一件事是在某个对象上调用原型方法以正确绑定
这个
关键字-这可以通过以下方法实现:

console.log(Me.constructor.prototype.name.call(Me));
输出将是:

Proto_:Steve Benj

另一种方法是使用相同结果的函数:

Object.getPrototypeOf(Me).name.call(Me)

Person构造函数中定义的函数将覆盖/覆盖它下面的原型定义,因此没有好的方法在构造函数中定义的函数上调用原型函数(关于“坏”的方法,请参阅文章中的注释)


我会考虑是否要为这两个函数使用相同的名称,除非这不是您的实际用例。我想说的是,您需要创建一个名为protoName或类似的原型函数,如果您需要不同的行为,您应该定义不同的函数。

类似的问题。我认为您在本例中试图做的是不可能的,您可能需要尝试另一种方法。
me.\uuu proto\uuuu.name()
返回proto字符串,但不应使用
\uuuu proto\uuu
的可能重复不是与
me.constructor.prototype.name()
相同吗?@ThomasAltmann,
Me.constructor.prototype.name()。查看我关于
.call()
的解释哦,很抱歉,我只是查看了输出的前几个字符,认为一切都是你的,谢谢“对象和它的原型之间的关系是通过
构造函数
属性实现的:”我认为这是误导。每个对象都有一个引用对象原型的内部
[[Prototype]]
属性。对象的
构造函数的值不重要。例如,
var foo={bar:42};var baz=Object.create(foo)<代码>对象。getPrototypeOf(baz)!=prototype
@FelixKling,我指的是“明显的”关系。我不想让OP使用
\uuuuu proto\uuuuuu
(我们知道它不是标准的)