JavaScript-扩展内置对象与扩展自己的对象

时间:2020-04-25 08:12:37

标签: javascript object

我想知道JavaScript的以下行为。 当我想扩展一个标准的内置对象时,可以说数学,我可以简单地使用一个点在其上创建一个方法。

例如:

Math.sum = function(a, b) {
  return a + b;
}

但是,当我想扩展自己的对象时,我将不得不使用原型。

希望有人能启发我。

1 个答案:

答案 0 :(得分:3)

但是,当我想扩展自己的对象时,我将不得不使用原型。

不,您不会:

function Example() {
}
Example.sum = function(a, b) {
    return a + b;
};
console.log(Example.sum(1, 2)); // 3

函数上分配属性时,可以直接在该函数上调用它(与Math.sum一样)。这些通常称为静态方法

在分配给函数的prototype对象上的属性时,如果将该函数用作 constructor <,则将其添加到该对象中,该对象将用作新对象的原型。 / em>,通常通过new

const e = new Example();

这些被称为 prototype方法:对象从其原型继承的方法。

这是我上面的示例,它使用旧的ES5语法同时具有静态(sum)和原型方法:

function Example(x) {
    this.x = x;
}
Example.sum = function(a, b) {
    return a + b;
};
Example.prototype.add = function(y) { // DON'T DO THIS (not in this way), keep reading
    return this.x + y;
};
console.log(Example.sum(1, 2)); // 3
var e = new Example(1);
console.log(e.add(2)); // 3

但是,我强烈建议您不要通过赋值来创建原型方法。而是使用Object.defineProperty

function Example(x) {
    this.x = x;
}
Example.sum = function(a, b) {
    return a + b;
};
Object.defineProperty(Example.prototype, "add", {
    value: function(y) {
        return this.x + y;
    },
    writable: true,
    configurable: true,
    enumerable: false // <== This is the default, but for emphasis
});
console.log(Example.sum(1, 2)); // 3
var e = new Example(1);
console.log(e.add(2)); // 3

这样做的原因是,引用函数add的属性是不可枚举的(不会出现在for-in循环或{{1中}}等。


更进一步,在2020年,我将使用Object.keys语法(如果我想要一个带有与class一起使用的prototype对象的构造函数):

new