Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

在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();