JavaScript对象原型函数无法按预期方式使用

时间:2011-05-31 18:47:28

标签: javascript prototype-programming

如果您打开this JSFiddle,则应在Firebug / Chrome开发工具中看到,在调用x.method时会引发异常,因为method不存在。

但是,如果您在控制台中运行Object.methodFunction.method,您会发现它们确实存在于各自的原型中。

我确信它只是一个简单的继承问题,但此时我已经超越了method方法没有冒泡到x对象的原因。

代码如下:

// Crockford's Object.create shim
if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };
}

// Add a method creation function to the Function prototype
// Note that on this line I've also tried:
// Object.prototype.method = Function.prototype.method = function (name, func) { 
Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

// Create our object
var x = Object.create({});

// Add common methods to the prototype of our new object
x.method('logNumber', function (num) {
    console.log(num);
});

// Try it out
x.logNumber(6);

4 个答案:

答案 0 :(得分:2)

[注意] jsfiddle目前似乎已经停止,所以我无法检查您的代码

此功能:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

函数原型添加了一个方法。使用构造函数创建Object:使用new关键字调用的函数将创建它构造的Object的实例。在Object.create'shim'中,构造函数是F,但是shim返回它的实例new F())。

变量x 不是构造函数,而是实例。您只能从Function.prototype中调用method,因此x.methodundefined

使用Object.create可能会告诉您它是如何运作的:

function X(){}; //=> new X will create an instance of an empty Object
X.method('logNumber', function (num) {
     console.log(num);
});             //=> call 'method' from the constructor: now it's working
var x = new X;  //=> create an instance
x.logNumber(6); //=> behold!

答案 1 :(得分:0)

这可行,但没有控制台

Object.prototype.method = function (name, func) {
    this[name] = func;
};

http://jsfiddle.net/mplungjan/jhBjs/

答案 2 :(得分:0)

我相信您需要this.prototype[name] = func而不是this[name] = func。另外我猜你想要这个对象:

Object.prototype.method = function (name, func) {
    this.[name] = func
    return this
}

鉴于您已经在使用Crockford的对象,如果您不需要对所有Object使用此选项,则可以执行以下操作:

var X = { method: function (name, func) {
    this[name] = func
    return this
}

var x = Object.create(X)

答案 3 :(得分:0)

var x,x是一个Object,而不是一个函数,这就是你需要使用

的原因
Object.prototype.method = function (name, func) {    
  this[name] = func;    
  return this;
};