我想知道JavaScript的以下行为。 当我想扩展一个标准的内置对象时,可以说数学,我可以简单地使用一个点在其上创建一个方法。
例如:
Math.sum = function(a, b) {
return a + b;
}
但是,当我想扩展自己的对象时,我将不得不使用原型。
希望有人能启发我。
答案 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