创建原型时参考方法

时间:2012-11-15 13:51:10

标签: javascript prototype

我觉得有点倾倒,但我不了解(或者甚至知道它是否可能)关于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"

感谢。

4 个答案:

答案 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"