如何在不丢失原有功能的情况下扩展JavaScript中的对象
我有一个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等
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构造函数呢?