Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不丢失原有功能的情况下扩展JavaScript中的对象_Javascript_Object_Implementation - Fatal编程技术网

如何在不丢失原有功能的情况下扩展JavaScript中的对象

如何在不丢失原有功能的情况下扩展JavaScript中的对象,javascript,object,implementation,Javascript,Object,Implementation,我有一个JavaScript对象定义如下: var Object = (function () { function Object() { this.id = RandomNumber(); } // Custom Object.prototype / Object impementations here... return Object; })(); 问题是,一旦构建了它,它就失去了原始功能,如Object.defineProperty等

我有一个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; }

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

使用
.prototype
添加属性:

Object.prototype.specialMethod = function () {
    // Your method's code
};
你会像这样使用它:

var a = {};
a.specialMethod();
尽管我不鼓励在
对象的原型中添加属性,因为它是可枚举的,会打乱循环,并且会被所有对象以及从
对象继承的对象继承,这基本上就是一切

实际上,您可以使用您提到的
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
    }
});

为了扩展此对象,您应该创建另一个对象,并为其原型指定一个新的对象实例

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");
工作示例:

如果您想坚持使用自执行函数,这里是重写的示例:

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");
工作示例:


在这种情况下,我确实质疑自动执行函数的使用。它们通常用于封装和屏蔽内部,但是在代码示例中,它们是通过从SEF返回对象来公开的。返回对象并将其存储在全局变量中只会重新公开对象,从而允许操纵其原型和属性。也许有一些你没有提到的私有变量,但正如我所说的,我觉得SEF是不必要的。

按照Ian写的做。如果您还想检查该方法是否已经存在,请使用

if (Object.prototype.specialMethod == null) Object.prototype.specialMethod = function() { ... };

谢谢,但我不是这个意思。我不够清楚,所以我会更新我的问题。基本上,我需要向对象构造函数添加功能,即var x=new Object()将执行对象的任何操作,包括我希望它执行的操作。@series0ne-Ahh我明白了,很抱歉造成混淆。因此,当您使用类似于
var x=new Object()的东西时,您希望能够自动执行某些操作?就像总是在新创建的对象上设置一个属性,而不必每次都在主代码中显式地执行它一样?完全正确。后来我发现,我试图做的几乎是不可能的,因为这似乎破坏了JavaScript的继承性,所以使用原型似乎是唯一的选择,但是这会向用户公开一个我不想要的变量,但没有其他方法。不要覆盖对象构造函数。它不适用于对象文字,并且可能会导致许多副作用。为什么不创建一个CustomObject构造函数呢?