5

我对以下代码的期望是,如果我检查了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"
4

5 回答 5

1

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

似乎您正在尝试实现继承,这是一个很好的阅读: JavaScript 中的原型继承和 JavaScript中的经典继承

于 2012-10-26T04:17:35.343 回答
1

一个名为“prototype”的属性只是一个属性,它并不指向该对象所继承的对象。使用Object.getPrototypeOfor非标准__proto__属性来获得它。

因此,您的函数obj(me)返回的只是一个具有属性“原型”的对象,该对象指向一个具有属性“名称”的对象,该属性指向字符串keithnew由于您的函数返回一个对象,因此无论是否使用关键字调用它都没有区别。

对于继承,构造函数 [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
于 2012-10-26T05:37:25.150 回答
0

我怀疑您正在prototype以类似于覆盖undefined“值”的方式覆盖属性。

于 2012-10-26T04:02:29.223 回答
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"

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

于 2012-10-26T04:42:11.143 回答
-1

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

于 2012-10-26T04:03:33.783 回答