2012-10-26 46 views
4

我对以下代码的期望是,如果我检查了a.name,它会搜索原型并在声明时返回原型。任何人都可以指出这是什么阻止JS承认我的原型?Javascript原型怪癖 - 任何人都可以解释一下吗?

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

var me = { name: 'keith' }; 

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

a.name 
// => undefined 

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

回答

1

命名为“原型”的属性只是一个属性,它不指向该对象从中继承的对象。使用Object.getPrototypeOfnon-standard __proto__ property来获得。

所以你的函数obj(me)返回的只是一个属性为“原型”的对象,它指向一个属性为“name”的对象,它指向字符串keith。当你的函数返回一个对象时,它是否被new keyword调用也没有区别。

对于继承,构造函数function [object]的“prototype”属性值得关注。此构造函数创建的每个对象(不返回对象)与new关键字都从构造函数指向的“prototype”属性所继承的对象继承。所以,你可以这样做:

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 
0

我怀疑你是覆盖在一个类似的方式prototype属性如何可以覆盖undefined“值”。

-1

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

+0

他只是增加了一个新的属性'obj.prototype'命名为原型 –

+0

我觉得棒实际上是正确的,它看起来像不知何故,我取消了内部链接到“原型”,并取代了它具有JavaScript不会实现原型功能的属性。我认为这可能是新的关键字首先初始化对象,然后*然后*覆盖原型与一个新的值,这是不在范围链 – netpoetica

1

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

看来你正试图实现继承,这里是关于一个很好看的:Prototypal Inheritance in JavaScriptClassical Inheritance in JavaScript

+0

嘿,你是对的,我想在这里继承。感谢那些文章。我已经彻底地阅读了,但我认为这是丑陋的,必须使用一个函数返回你的对象,而不是在其创建中使用“新”。我认为这有点难以理解。希望找到一种方法来使用“新”的可能性 – netpoetica

0

这里的问题是,你正在返回一个名为prototype与亲值,这是一个对象的属性,所以你正在返回prototype = {name = 'keith'},当你调用新的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库

+0

这实际上只是将属性从一个对象克隆到另一个对象,而我最终希望能够使用“原型”,因为在一个对象中使用“超级”属性古典语言。这会工作,但它不是完全继承:-) – netpoetica

+0

你没有提到继承。你在'java'中引用'super'关键字? –

+0

@Keith,检查我的编辑 –

相关问题