Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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 如何正确扩展Obect.prototype?_Javascript_Prototype Programming - Fatal编程技术网

Javascript 如何正确扩展Obect.prototype?

Javascript 如何正确扩展Obect.prototype?,javascript,prototype-programming,Javascript,Prototype Programming,我正在编写一个JavaScript库,它提供函数tablify(任何内容),它能够将任何数组或对象表示为HTML表 现在我尝试扩展数组和对象原型,以便像这样使用它: var arr = ["a", "b", "c"]; var obj = {"A": "a", "B": "b", "C": "c"}; arr.tablify(); obj.tablify(); 这是我的方法: Array.prototype.tablify = function() { return tablify(t

我正在编写一个JavaScript库,它提供函数
tablify(任何内容),它能够将任何数组或对象表示为HTML表

现在我尝试扩展数组和对象原型,以便像这样使用它:

var arr = ["a", "b", "c"];
var obj = {"A": "a", "B": "b", "C": "c"};
arr.tablify();
obj.tablify();
这是我的方法:

Array.prototype.tablify = function() {
    return tablify(this);    
}
Object.defineProperty(Object.prototype, 'tablify', {
    value: function () {
        return tablify(this);
    },
    writable:     true,
    configurable: true,
    enumerable:   false
});
问题是,JavaScript中的所有内容都是对象,因此不仅像
{a:1,b:2}
这样的文本可以转换,其他所有内容也可以转换

这没什么大不了的,因为我的
tablify()
也可以处理基本类型,但是当我扩展Object.prototype时,
typeof anything
总是返回
“Object”
,我无法再区分类型:

function tablify(object) {  
    if (object instanceof Array) {  
        return ArrayToTable(object);
    } 
    //This is always true if I extend Object.prototype: 
    if (typeof object === "object") {   //only for "normal" objects like "{a: 1, b: 2, c: [],...}"
        return ObjectToTable(object);
    }
    return PrimitiveToTable(object);    //strings, numbers, functions, ... 
}
  • 为什么
    typeof
    总是返回
    “对象”
  • JS-API提供这种功能(使用“.tablify();”扩展数组/对象)是件好事吗
  • 如何区分“正常”对象、数字、函数等
  • 是否可以仅扩展“正常”对象? (禁止
    (42).tablify();
    字符串.tablify();
    。)
  • 那些“普通”对象的名称是什么?我该怎么称呼他们

问题是,一旦您在原型上使用了新添加的方法,原始原语值就已经被转换了。例如:

"foo".tablify();
在该调用中,在调用函数之前,字符串原语将转换为字符串实例。换句话说,它的行为就好像你写过:

new String("foo").tablify();
我想您可以使用
Object.prototype.toString
函数来区分:

function  tablify(obj) {
    if (typeof obj === "object") {
      var sig = {}.toString.call(obj);
      if (/ (String|Number|Boolean)\]$/.test(sig)) {
        // treat as primitive
      }
      else {
        // object
      }
    }
    // ...
}
您无法判断装箱原语是否是隐式创建的,但这可能与您的代码的功能无关

为什么
typeof
总是返回
“对象”

因为在sloppy模式下,始终应该是一个对象。当调用函数或传递undefined或null时,将获得全局对象,当调用方法时,上下文将转换为对象

用于您的
tablify
方法,它将起作用

JS-API提供这种功能(使用
.tablify();
扩展数组/对象)是件好事吗

。当你想分享你的脚本时,很多人会皱眉不愿意使用它。有关详细讨论,请参阅

至少你有-但我建议在
数组上使用它们。prototype
也一样,太多人滥用
进行in
枚举

如何区分“正常”对象、数字、函数等

typeof
看起来不错

是否可以仅扩展“正常”对象?(禁止(42).tablify();,“字符串”.tablify();…)

不是真的。所有原语包装器都继承自
Object.prototype

那些“普通”对象的名称是什么?我该怎么称呼他们


只是“物体”。或者,如果您愿意,可以使用“普通对象”(将它们与数组、内置对象、主机对象区分开来)。

从对象创建HTML的函数听起来不像您通常希望添加到本机对象原型中的东西?并非“JavaScript中的所有内容都是对象”。字符串、数字和布尔不是对象。在被调用的情况下,它们的行为确实像对象,因为语言会隐式地将它们转换为相应的对象类型。@Pointy当我使用代码时,
42.tablify()
“字符串”.tablify()
函数表()也在工作,尽管我只扩展了Object.prototype。
typeof
还返回
“object”
如果(object.prototype.toString.call(object)===“[object object]”)
re:edit:use
42..tablify()
(第一个点被解析为小数点)或
(42).tablify()
。谢谢,这真的很有用。我使用严格模式使它工作,不过我将删除该功能,因为它的优势是最小的。