我见过一些人向对象类添加方法,如下所示:
Object.clone = function() {
}
这种语法是像任何其他函数名称一样只有一个句点,还是实际上添加到 Object 类?这和原型方法一样吗?这样做(或使用原型)与仅仅制作函数克隆相比有什么优点/缺点?
我见过一些人向对象类添加方法,如下所示:
Object.clone = function() {
}
这种语法是像任何其他函数名称一样只有一个句点,还是实际上添加到 Object 类?这和原型方法一样吗?这样做(或使用原型)与仅仅制作函数克隆相比有什么优点/缺点?
在 JavaScript 中,一切都是对象,这意味着您可以将属性附加到任何对象,就像使用对象字面量一样,例如:
var arr = [1,2,3];
arr.property = 'foo';
但是,在非对象上这样做并不是一个好习惯。
每个对象都有一个构造函数,所以一个数组有一个Array
构造函数,一个对象有一个Object
构造函数,等等。prototype
对象的 是一个对象,其上下文是实例,当你用 实例化自定义对象时,就会发生这种情况new
。
当您将方法附加到该prototype
对象时,它将在该对象的所有实例之间共享。当您将函数附加到构造函数时,您基本上是在命名空间下隐藏了一个全局(取决于范围);上下文不是实例,它不依赖于一个。您可以将这些函数视为静态方法。
扩展Object.prototype
很麻烦,因为这是“母对象”。扩展Object
构造函数本身并没有那么糟糕,但不是最佳实践。最好的解决方案,只需创建自己的命名空间:
var MY = {};
MY.clone = function(){};
无需向内置Object
构造函数添加静态函数。如果这样做,代码的健壮性也会出现问题,因为某些当前和未来的环境可能会引入同名的内置方法,然后就会出现名称冲突。
只需将您的方法添加到您自己的对象中。