javascript - JS - 每次创建类时都会重新定义类成员函数吗?
问题描述
当使用 new 关键字创建此类结构时,JavaScript 是否每次都重新创建在类或函数内部定义的函数?还是用指向原始类的指针重新创建它以节省内存?更进一步——如果这样的娱乐发生,是否值得在常用和大量使用的对象之外指定功能?
解决方案
您的问题可以使用更多细节,因为它取决于您的代码的外观。例如,如果您在谈论原型方法,那么不,新实例将简单地引用原型方法。您可以在以下示例中看到:
function Person(name) {
this.name = name;
}
Person.prototype.introduce = function() {
console.log('Hi, my name is ' + this.name);
}
let nick = new Person('Nick');
Person.prototype.introduce = function() {
console.log('Howdy, I am ' + this.name);
}
nick.introduce();
显然在这种情况下,nick.introduce
是指原型方法(搜索原型链的实际机制有点复杂,我建议进行一些侧面研究)。
另一个例子实际上是在构造函数中声明一个函数。在这种情况下,您实际上是在每次实例化对象时创建它。下面类似的例子。
function Person(name) {
this.name = name;
this.introduce = function() {
console.log('Hi, my name is ' + this.name);
}
}
let nick = new Person('Nick');
Person.prototype.introduce = function() {
console.log('Howdy, I am ' + this.name);
}
nick.introduce();
在这种情况下,nick
实例获得了自己的introduce
方法,所有未来的实例都将获得自己的introduce
方法。在这种情况下,分配或更改同名的原型方法无关紧要,因为我们在nick
名为 的实例上找到了自己的属性introduce
,因此我们不必搜索原型链。
推荐阅读
- bash - 将位置参数传递给包含 `.` 点的 bash 函数
- r - R:在 R 中绘制多项式
- python - TypeError: __str__ 在输出中返回非字符串(NoneType 类型)
- netlogo - 如何在 NetLogo 扩展中使用“打印”或“显示”?
- mysql - Feathers - PATCH 时 where 子句中的未知列
- spring - 带有 http 连接池的 SSL
- html - 为什么显示“找不到新闻标题”?
- arrays - 如何将 Array#map 结果分配给可变元组`[P in keyof T]:ReturnType
`? - java - 使用java计算xml字符串中给出的数学表达式
- sparql - 如何编写分页 SPARQL 查询以获取具有多个相同节点的产品列表