javascript - JS 类中的方法 - 为什么代码会抛出错误?
问题描述
有谁知道为什么在下面的代码示例中,当 ES6 类只是构造函数和原型模式之上的语法糖时,JS 会抛出错误?
// Example 1
class Cat {
meow() {
console.log('Meow meow!')
}
}
let kitty = {};
Object.assign(kitty, Cat.prototype);
kitty.meow(); // TypeError: kitty.meow is not a function
为什么这个代码片段在功能上应该与上面的代码片段相同时起作用?
class Cat {
}
Cat.prototype.meow = function() {console.log('Meow meow!')}
let kitty = {};
Object.assign(kitty, Cat.prototype);
kitty.meow(); // Meow meow!
解决方案
Object.assign
将一个或多个源对象的可枚举属性复制到目标对象。除非如此定义,否则默认情况下方法是不可枚举的。Object.create
另一方面,如果出于某种原因你想这样做,可以创建你的类的一个新实例。
class Cat {
meow() { console.log('Meow meow!') }
}
let kitty = Object.create(Cat.prototype);
kitty.meow();
Object.assign
以下是说明如何工作的示例。在下面的示例中, using将两个实例Object.assign
的可枚举属性复制到,它混合了它们的属性,但它本身不是实例。Cat
kitten3
Cat
var id = 1;
class Cat {
constructor(name) {
this.id = id++;
if (name) this.name = name;
}
}
let kitty1 = new Cat("Lucy");
console.log(kitty1.id, kitty1.name, kitty1 instanceof Cat);
let kitty2 = new Cat();
console.log(kitty2.id, kitty2.name, kitty2 instanceof Cat);
let kitty3 = {};
Object.assign(kitty3, kitty1, kitty2);
console.log(kitty3.id, kitty3.name, kitty3 instanceof Cat);
在您设置的更新代码中Cat.prototype.meow = function() {}
,您直接执行此操作,这使其成为对象(原型)的可枚举属性,这就是Object.assign
有效的原因。您可以使用Object.keys
. 更接近于第一个声明的方法是使用Object.defineProperty
并使其不可枚举来定义方法:
class Cat1 {
meow() { console.log('Meow meow!') }
}
class Cat2 {}
Cat2.prototype.meow = function() { console.log('Meow meow!') }
class Cat3 {}
Object.defineProperty(Cat3.prototype, "meow", {
value: function() { console.log('Meow meow!') },
enumerable: false
});
console.log("Cat1: ", Object.keys(Cat1.prototype));
console.log("Cat2: ", Object.keys(Cat2.prototype));
console.log("Cat3: ", Object.keys(Cat3.prototype));
推荐阅读
- c# - NUnit - SetUp、Test 和 TearDown - 未调用
- c# - 具有表单状态值的自定义 FormDialog 描述:MS BOT C#
- hyperledger-fabric - Hyperledger Fabric 中的访问控制列表
- javascript - 为什么当我处理新列表时父列表对象的属性会更新
- hibernate - org.postgresql.util.PSQLException:错误:“。”处或附近的语法错误 带有排序查询的 Spring 可分页对象
- spring - 如何使用gradle为spring boot web项目创建jar文件
- python - 使用子进程处理带有空格的 os.path.join 路径
- sql - 如何使用 SQL 获取表中的隐式相关记录?
- javascript - 过滤器在 forEach 中不起作用,角度为 6
- sql - 访问追加查询与表比较