我觉得有点倾倒,但我不了解(或者甚至知道它是否可能)关于JavaScript的原型设计。
我想在创建伪类的原型时使用方法:
var Class = function() {}
Class.prototype = {
a: function() {
return 'ok'
}
, z: Class.prototype.a() // I tried with `this`/`constructor`/etc.
} // TypeError: Object [object Object] has no method 'a' the rest isn't evaluated
var test = new Class()
test.z
我知道我可以这样做,但我想知道我是否仍然可以在Class.prototype
声明中保留我的所有方法/属性:
var Class = function() {}
Class.prototype.a = function() {
return 'ok'
}
Class.prototype.z = Class.prototype.a()
var test = new Class()
test.z // "ok"
感谢。
答案 0 :(得分:2)
var x = {
y: 10,
z: x.y + 5 // TypeError, cannot read property `y` of undefined
};
变量x
没有值(是声明,因为声明被提升,但它的值是undefined
),直到赋值表达式完整为止已被评估过。
答案 1 :(得分:1)
是的,你可以。您可以像这样分配Class
:
var Class = function() {
if (!Class.prototype.a){
var proto = Class.prototype;
proto.a = function() {
return 'ok';
};
proto.z = proto.a();
}
}
var test = new Class;
console.log(test.z); //=> "ok"
另一种选择可能是使用单例来创建原型属性/方法:
var Class = function(){};
Class.prototype = function(){
function a(){return 'ok';}
return {a: a, z: a()};
}();
var test = new Class;
console.log(test.z); //=> "ok"
答案 2 :(得分:1)
如果您只需要添加一个附加属性,则可以执行以下操作:
(Class.prototype = {
a: function() {
return 'ok'
}
}).z = Class.prototype.a();
或者你可以采用这种方法,它使用匿名函数作为临时构造函数:
Class.prototype = new function() {
this.a = function() {
return 'ok'
}
this.z = this.a()
}
答案 3 :(得分:0)
首先:接受的答案是错误的。你可以。
第二:曾见过以下模式?
Class.prototype = {
constructor: Class
};
如果要使用constructor
访问当前对象,则必须使用this
属性。
第三:如果您不在属性函数中,则上下文为window
,(严格模式下为undefined
),而不是对象。
第四:这就是你要找的东西:
function Class() {}
Class.prototype = {
constructor: Class, // required!
a: function() {
return 'ok';
},
z: function() {
// 'this' is the object *in* the function
return this.a();
}
};
var o = new Class();
console.log(o.z()); // "ok"