在Javascript中扩展对象
我试图通过以下方式扩展对象功能:在Javascript中扩展对象,javascript,oop,Javascript,Oop,我试图通过以下方式扩展对象功能: Object.prototype.get_type = function() { if(this.constructor) { var r = /\W*function\s+([\w\$]+)\(/; var match = r.exec(this.constructor.toString()); return match ? match[1].toLowerCase() : undefined;
Object.prototype.get_type = function() {
if(this.constructor) {
var r = /\W*function\s+([\w\$]+)\(/;
var match = r.exec(this.constructor.toString());
return match ? match[1].toLowerCase() : undefined;
}
else {
return typeof this;
}
}
这很好,但有一个问题:
var foo = { 'bar' : 'eggs' };
for(var key in foo) {
alert(key);
}
循环有三段。
有什么方法可以避免这种情况吗?您不应该扩展对象原型,原因正是: 改用静态方法 如果您没有选择,可以使用“hasOwnProperty”方法:
您可以使用
hasOwnProperty()
方法检查属性是否属于foo
对象:
var foo = { 'bar' : 'eggs' };
for (var key in foo) {
if (foo.hasOwnProperty(key)) {
alert(key);
}
}
创建自己的对象,而不是扩展默认对象 另见:
对象上,正如其他人所发布的那样
有没有办法避免这种情况
是的,不要扩展本机类型
改用包装器:
var wrapper = (function(){
var wrapper = function(obj) {
return new Wrapper(obj);
};
function Wrapper(o) {
this.obj = obj;
}
Wrapper.prototype = wrapper.prototype;
return wrapper;
}());
// Define your get_type method:
wrapper.prototype.get_type = function(){
if(this.obj.constructor) {
var r = /\W*function\s+([\w\$]+)\(/;
var match = r.exec(this.obj.constructor.toString());
return match ? match[1].toLowerCase() : undefined;
}
else {
return typeof this.obj;
}
};
用法:
var obj = { 'bar' : 'eggs' };
alert(wrapper(obj).get_type());
for(var i in obj) { ... works properly }
一、 首先,我并不完全反对扩展本机类型和。以良好的方式为我们解决其他答案和链接文章中提到的问题。请参阅这些,以获得良好的概述
可以扩展任何对象并定义控制这些属性行为的属性描述符。属性可以设置为不可枚举,这意味着当您在<代码>for..循环中访问对象属性时,该属性将不包括在内
以下是如何在Object.prototype本身上定义getType
方法,并使其不可枚举:
Object.defineProperty(Object.prototype, "getType", {
enumerable: false,
writable: false,
configurable: false,
value: function() {
return typeof this;
}
});
// only logs "foo"
for(var name in { "foo": "bar" }) {
console.log(name);
}
上面的getType
函数基本上是无用的,因为它只返回object
的类型,在大多数情况下,该类型只是object,但它只是用于演示
[].getType();
{}.getType();
(6).getType();
true.getType();
如果我写一些框架?这将是不容易使用的。啊,你发布它只快了几秒钟。你链接到的文章认为扩展对象原型是不好的,因为你添加的属性将是可枚举的,并且在使用in
操作符时会显示出来。但是,使用Object.defineProperty可以设置这些属性,使其不可枚举。这似乎解决了这个问题,尽管不能保证扩展对象原型会产生其他问题。如果您还没有阅读过,我强烈建议您这样做。在尝试用JavaScript实现OOP时,它们非常有用。注:原型帖子比经典文章更新,所以如果你发现冲突或意见改变,我认为它是权威的。不要!只是不要!每次你在一个函数的原型中添加一些你不拥有的东西,一个人就会死,就像那样!!!这只是ECMA-262第5版的版本吗?换句话说,就浏览器而言,它的支持范围有多广?谢谢是的,它是在ES5中实现的。您可以看到不同浏览器的最新实现状态。
Object.defineProperty(Object.prototype, "getType", {
enumerable: false,
writable: false,
configurable: false,
value: function() {
return typeof this;
}
});
// only logs "foo"
for(var name in { "foo": "bar" }) {
console.log(name);
}
[].getType();
{}.getType();
(6).getType();
true.getType();