javascript - JS组合/继承原型
问题描述
我希望能够扩展.extend(obj)
函数中给出的任何对象。到目前为止,除了传入对象文字时,我已经让它工作了。
例子:
class myClass {
static extend(obj) {
Object.assign(Object.getPrototypeOf(obj), myClass.prototype);
myClass.call(obj);
}
sayHello() {
return 'hello!'
}
}
当从构造函数中调用扩展函数时,这很好用,如下所示:
function foo() {
myClass.extend(this);
}
const bar = new foo();
bar.sayHello();
但是,当我传入一个已经创建的对象文字时,来自 myClass.prototype 的方法不可用。
const foo = {};
myClass.extend(foo);
foo.sayHello(); // this is not available.
有没有办法检查最后一种情况并将原型分配给对象本身而不是它的原型,以便最后一种情况也可以工作?
static extend() {
if (/* obj is an object literal */) {
Object.assign(obj, myClass.prototype);
} else {
// first example
}
解决方案
当从构造函数中调用扩展函数时,这很好用,如下所示:
它不应该正常工作,当我运行它时,我得到了错误Class constructor myClass cannot be invoked without 'new'
。该错误是由于该语句myClass.call(obj);
。只有当我将类更改为 ES5 构造函数时,它才能工作。
但是,当我传入一个已经创建的对象文字时,来自 myClass.prototype 的方法不可用。
他们是给我的。
function myClass() {}
myClass.extend = function(obj) {
Object.assign(Object.getPrototypeOf(obj), myClass.prototype);
myClass.call(obj);
}
myClass.prototype.sayHello = function() {
return 'hello!'
}
const foo = {};
myClass.extend(foo);
foo.sayHello(); // "hello!"
推荐阅读
- python - 如何提取所有医生姓名
- r - 查找出现次数最多的组合词
- sql - 处理带有重复项的 MERGE
- java - 有没有一种方法可以在用户按下按钮或输入后显示我的打印语句?
- python-3.x - 在 tkinter 中显示 shapefile?
- java - Avast Antivirus / MailShield 更新后 Java 套接字连接被拒绝
- snmp - 如何为多个代理运行 snmp 模拟器?
- kubernetes - Kubernetes 资源配置中的 request 和 args 有什么区别?
- postgresql - Dataproc 尝试通过 JDBC 连接到 Postgres,缺少权限
- node.js - typescript dependency injection with little footprint