我的问题在于以下表达式:
var prototype = Object.create(extend && extend.prototype);
我认为它创建了继承extend对象的原型对象。并且extend && extend.prototype
正在检查是否存在extend并且extend.prototype存在。如果任何一个都不存在,那么prototype将是一个没有超类的对象。如果两者都存在,原型会继承延伸吗?如何将extend.prototype
与extend && extend.prototype
语法结合使用?
如果var prototype = Object.create(extend && extend.prototype)
和var prototype = Object.create(extend.prototype)
都在那里,那么extend
和extend.prototype
是一样的吗?
感谢。
答案 0 :(得分:2)
关键是在JavaScript中,与其他C-heritage语言不同,&&
运算符不一定(必然)具有布尔结果。 &&
操作的值是第一个" falsy"的值。表达式,或者是最后一个表达式的值。它所做的测试是在子表达式的强制布尔值上执行的,但结果值是最后一个要评估的子表达式的原始值。
这在
的评估中extend && extend.prototype
结果值将是子表达式extend
或子表达式extend.prototype
的值。如果extend
为null
或undefined
或其他任何"虚假"值,那么该值将是整体结果。否则,该值将是extend.prototype
的值。
请注意,如果extend
是一个简单的对象,特别是没有名为prototype
的属性的对象,则整体值可能仍为undefined
。很明显,问题中代码的意图是选择传入构造函数的原型引用,但它不是"防弹"代码。