为什么把成员添加到构造函数而不是Prototype中?
Why add members to Constructor function and not to Prototype?
为什么要将成员添加到构造函数而不是原型中?
function foo() {
}
foo.prototype.isThereSayShoeSize = function() {
console.log(this.sayShoeSize);
}
foo.fooObject = {num: 100, shoeSize: 43}
foo.sayShoeSize = function() {
console.log(foo.fooObject.shoeSize)
}
var myFoo = new foo();
console.log(myFoo.sayShoeSize); //undefined
myFoo.isThereSayShoeSize() //undefined
成员不为实例所有,也不为实例间共享。因此,这些成员不能通过instance.member
语法访问,也不能在实例中使用this
关键字访问。
因此,添加到构造函数中的成员似乎与类型没有关系。
我只能想到两种可能的解释。通过将这些成员与类型分组来节省名称空间,如果这些成员与类型无关,那么这样做就没有多大意义。它们是静态成员,可以在没有类型实例的情况下访问。如果有其他类型的对象希望使用这些成员,这是有意义的。但是在我看到这种模式的上下文中,这些成员仅由它们所附加的类型的实例使用。因此,在这种情况下,它们与类型相关并且只由类型的实例使用,那么为什么不将它们放在原型中呢?我对此有点困惑,你可能会说。我认为,也许这种向构造函数添加成员的模式在我所看到的上下文中是不合适的,成员应该被添加到原型中。但你认为这些成员是静态的吗?让成员既可以被其所连接的类型消费,也可以被其他类型消费,这是这种模式的主要用途吗?
当你这样做的时候:
function foo() {};
foo.fooObject = {num: 100, shoeSize: 43};
它类似于在c++世界中设置一个类变量,所有实例都可以使用它作为foo.fooObject
,并且所有实例都是相同的。这是一种设置全局变量的命名空间方式。正如您所指出的,它们不是实例变量,所以这种技术应该只在需要一个有作用域的全局变量时使用。
基本上有静态方法和属性。
为什么?如何?
让我们忘记foo
是用来作为构造函数的。添加到foo
的方法是foo()
函数的成员(函数也是对象,所以它们也可以有方法)
因此,要调用这些方法,您只需访问foo
函数的成员。这意味着要么
foo.sayShoeSize();
或
foo['sayShoeSize']();
此时,您不必使用new
操作符调用foo
。由于没有原型链的一部分,使用foo
作为构造函数创建的对象将不会继承这些方法和属性。这意味着:var myFoo = new foo();
console.log(typeof myFoo.sayShowSize); // undefined
总而言之,直接在构造函数上定义的函数不应该使用或依赖this
。换句话说,this
将被绑定到全局对象(当然,除非使用apply或call调用它们)
相关文章:
- ES6构造函数返回基类的实例
- JavaScript继承构造函数.prototype
- 为什么更改函数的 .prototype 会影响已使用该构造函数创建的对象的“实例”
- 模拟“类”时,为什么要在 .prototype 属性中设置方法,而不是在构造函数本身中设置方法
- Javascript-Prototype没有读取构造函数变量
- JS中的prototype和构造函数属性
- Prototype构造函数上下文中的JavaScript类型检查和异常
- JS,prototype:有了构造函数,我怎么能得到一个实例
- 为什么实例没有't在没有prototype关键字的情况下继承添加到构造函数的属性
- 如何创建一个JavaScript构造函数,将自定义字符串返回给Object.prototype.toString()
- 如何使用Object.prototype将函数添加到对象构造函数
- 原型链中的函数解析将如何为Object.prototype作为构造函数工作
- 使用'this'在构造函数中使用prototype属性
- JavaScript继承:在构造函数中使用__proto__,而不是构造函数的prototype属性
- Javascript -在构造函数或构造函数的prototype属性中设置属性
- prototype属性的构造函数实例的奇怪行为
- 为什么把成员添加到构造函数而不是Prototype中?
- Javascript在构造函数中将dom事件设置为prototype方法
- 直接向JavaScript构造函数添加方法和使用prototype添加方法有什么区别
- 是什么让 object.prototype 成为构造函数,如果他没有名字