我的问题是关于以下表达式:
var prototype = Object.create(extend && extend.prototype);
我认为它正在创建继承扩展对象的原型(prototype)对象。和extend && extend.prototype
正在检查extend是否存在以及extend.prototype是否存在。如果其中一个不存在,原型(prototype)将是一个没有父类(super class)的对象。如果两者都存在,prototype会继承extend吗?它怎么知道使用extend.prototype
与 extend && extend.prototype
语法?
所以var prototype = Object.create(extend && extend.prototype)
和var prototype = Object.create(extend.prototype)
如果 extend
则相同和extend.prototype
有吗?
谢谢。
最佳答案
关键是在 JavaScript 中,与其他继承 C 语言的语言不同,&&
运算符(不一定)有 bool 结果。 &&
运算的值是第一个“假”表达式的值,或者是最后一个表达式的值。它所做的测试是对子表达式的强制转换为 bool 值执行的,但结果值是最后评估的子表达式的原始值。
本次评价
extend && extend.prototype
结果值将是子表达式 extend
的值或子表达式 extend.prototype
的值。如果 extend
为 null
或 undefined
或任何其他“假”值,则该值将是总体结果。否则,该值将是 extend.prototype
的值。
请注意,例如,如果 extend
是一个简单对象,特别是没有名为 prototype
的属性的对象,则总体值可能仍为 undefined
。很明显,问题中代码的意图是选择传入构造函数的原型(prototype)引用,但它不是“防弹”代码。
关于对象创建中的 JavaScript && 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28858767/