我对以下代码的期望是,如果我检查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"
答案 0 :(得分:1)
在功能中,您没有触及功能原型。您只是返回一个具有属性“prototype”的新对象,其中parent为值。因此,您只能通过该属性访问它。
您似乎正在尝试实现继承,这里有一个很好的解读:Prototypal Inheritance in JavaScript和Classical Inheritance in JavaScript
答案 1 :(得分:1)
名为"原型"它只是一个属性,它不指向对象继承的对象。使用Object.getPrototypeOf
或non-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)
你似乎用假的原型覆盖了真正的原型。