Javascript原型Quirk - 任何人都可以解释这个吗?

时间:2012-10-26 03:57:36

标签: javascript prototypal-inheritance

我对以下代码的期望是,如果我检查a.name,它将搜索原型并在声明时返回它。任何人都可以确定是什么阻止JS承认我的原型?

var obj = function(parent){
    return {
        prototype: parent
    }
};

var me = { name: 'keith' };

var a = new obj(me)
// => undefined

a.name
// => undefined

a.prototype.name
// => "keith"

5 个答案:

答案 0 :(得分:1)

在功能中,您没有触及功能原型。您只是返回一个具有属性“prototype”的新对象,其中parent为值。因此,您只能通过该属性访问它。

您似乎正在尝试实现继承,这里有一个很好的解读:Prototypal Inheritance in JavaScriptClassical Inheritance in JavaScript

答案 1 :(得分:1)

名为"原型"它只是一个属性,它不指向对象继承的对象。使用Object.getPrototypeOfnon-standard __proto__ property即可。

那么你的函数obj(me)返回的只是一个带有属性的对象" prototype"它指向一个具有属性的对象" name"它指向字符串keith。当你的函数返回一个对象时,是否使用new keyword调用它没有区别。

继承,"原型"构造函数[object]的属性值得关注。由此构造函数(不返回对象)创建的具有new关键字的每个对象都继承自"原型" 构造函数点的属性。所以你可以这样做:

var Constructor = function() {
    console.log(this); // logs the currently created object
    // return nothing
}
Constructor.prototype = { name: 'keith' };

var a = new Constructor(); // logs an empty object
Object.getPrototypeOf(a) === Constructor.prototype; // true
a.name; // "keith" - inherited

答案 2 :(得分:0)

我怀疑你覆盖prototype属性的方式与覆盖undefined“值的方式类似。”

答案 3 :(得分:0)

这里的问题是你返回一个名为prototype的属性,其值为parent,这是一个对象,所以你要返回prototype = {name = 'keith'}对,当你调用new obj时,你正在添加a原型名为prototype的新属性。

你需要稍微改变,我需要这是你想要做的。这样可以工作,只需要注意过载属性。

var obj = function(parent){
   for(var propt in parent){
      this[propt] = parent[propt];
   }
}

var me = { name: 'keith' };
var a = new obj(me);
console.log(a);
// => Object { name="keith"}
console.log(a.name);
// => "keith"

编辑:如果您正在寻找使用原型的继承,您应该read this或尝试TypeScript,一个新的javascript类型和OO库

答案 4 :(得分:-1)

你似乎用假的原型覆盖了真正的原型。