在javascript中对原型感到困惑

时间:2014-01-03 09:06:46

标签: javascript prototype

var y=function(){
    return new y.prototype.greeting();
}
y.prototype={
    greeting:function(){
        alert("hello world");
    }
}

new y();

以上代码将提醒(“hello world”);

但如果我删除.prototype并将该行更改为return new y.greeting();

将发生错误:

  

undefined不是函数

var y=function(){
    return new y.greeting();
}
y.prototype={
    greeting:function(){
        alert("hello world");
    }
}

new y();

为什么我不能在没有greeting的情况下调用prototype方法?

非常感谢

2 个答案:

答案 0 :(得分:2)

y是一个函数,其[[Prototype]]Function - 所以当您要求口译员为您查找y.greeting时,它首先会查看y 1}}本身,然后检查Function.prototype然后检查Object.prototype

当您创建 new y时,prototype的{​​{1}}属性将在创建的对象上设置。因此,如果您执行了y,那么您将获得new (new y()).greetings()

考虑它的另一种方法是构造函数的alert属性是通过调用prototype创建的任何子对象的prototype。构造函数的实际内部new constructor将始终基于构造 it 的任何内容。

您可以在下面放在一起的示例中看到这一点。 [[Prototype]]将返回内部Object.getPrototypeOf属性,因此我们可以看到实际发生的情况:

[[Prototype]]

答案 1 :(得分:0)

return new y.greeting();尝试访问y实际不存在的属性(函数)。这就是它抛出错误'undefined is not a function'的原因,因为y的属性包含一个包含函数的变量。它就像三层楼,你不能从二楼到一楼而不去一楼;层次结构。知道了吗?