1

我有一个这样定义的 JavaScript 对象:

var Object = (function () {
    function Object() {
        this.id = RandomNumber();
    }

    // Custom Object.prototype / Object impementations here...

    return Object;
})();

问题是,一旦构建完成,它就会失去原始功能等Object.defineProperty

这个想法是我想扩展 Object 的基本功能,而不是重写或覆盖现有的原型。

如何做到这一点?

编辑:为了清楚起见,我知道我可以在不影响原始功能的情况下做到这一点:

Object.prototype.foo = function() { }

但我需要专门为对象的构造函数添加功能,即

function Object() { this.id = 0; }

新功能不得覆盖原始功能。

4

3 回答 3

3

使用.prototype添加属性:

Object.prototype.specialMethod = function () {
    // Your method's code
};

你会像这样使用它:

var a = {};
a.specialMethod();

虽然我不鼓励向Object' 的原型添加属性,因为它是可枚举的并且会弄乱循环,并且会被所有对象以及继承自 的对象继承Object,这基本上就是一切。

您实际上可以使用Object.defineProperty您提到的方法:

Object.defineProperty(Object.prototype, "specialMethod", {
    enumerable: false,    // The important one, to avoid looping problems
    configurable: false,
    writable: false,
    value: function () {
        // Your method's code
    }
});
于 2013-05-17T14:18:33.540 回答
0

为了扩展这个对象,你应该创建另一个对象,并为其原型分配一个新的 Object 实例。

var Object = (function () {
    function Object() {
        this.id = 5;
    }

    Object.prototype.speak = function(prop){
       alert(this[prop]);
    }

    return Object;
})();

function ExtendsObject(prop){
    this.someProperty = prop;
}

ExtendsObject.prototype = new Object();

var xObj = new ExtendsObject("derived");
xObj.speak("id");
xObj.speak("someProperty");

工作示例:http: //jsfiddle.net/RbCcA/

如果你想坚持使用自我执行功能,这里是重写的示例:

var Object = (function () {
    function Object() {
        this.id = 5;
    }

    Object.prototype.speak = function(prop){
       alert(this[prop]);
    }

    return Object;
})();

var ExtendsObject = (function(){

    function ExtendsObject(prop){
       this.someProperty = prop;
    }

    ExtendsObject.prototype = new Object();

    return ExtendsObject;
})();

var xObj = new ExtendsObject("derived");
xObj.speak("id");
xObj.speak("someProperty");

工作示例:http: //jsfiddle.net/RbCcA/1/

我确实质疑在这种情况下使用自执行功能。它们通常用于封装和屏蔽内部结构,但是在代码示例中,它们是通过从 SEF 返回对象来暴露的。返回对象并将其存储在全局变量中只是重新公开对象,允许对其原型和属性进行操作。也许有你没有提到的私有变量,但如前所述,我发现 SEF 是不必要的。

于 2013-05-17T14:20:26.670 回答
0

照伊恩写的去做。如果您还想检查它,该方法已经存在,请使用

if (Object.prototype.specialMethod == null) Object.prototype.specialMethod = function() { ... };
于 2013-05-17T14:23:33.477 回答