1

我觉得有点丢脸,但我对 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

4 回答 4

2

不,你不能。就像在定义它们的语句结束之前您不能引用任何对象属性一样:

var x = {
    y: 10,
    z: x.y + 5 // TypeError, cannot read property `y` of undefined
};

该变量x没有值(它声明,因为声明被提升,但它的值是undefined),直到整个赋值表达式被评估。

于 2012-11-15T13:53:07.477 回答
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"
于 2012-11-15T13:59:28.393 回答
1

如果您只有一个额外的属性要添加,您可以这样做:

(Class.prototype = {
    a: function() {
        return 'ok'
    }
}).z = Class.prototype.a();

或者您可以采用这种方法,它使用匿名函数作为临时构造函数:

Class.prototype = new function() {
    this.a = function() {
        return 'ok'
    }
    this.z = this.a()
}
于 2012-11-15T14:09:55.497 回答
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"
于 2012-11-15T14:21:21.360 回答