Javascript: Object or Object.prototype?
Javascript: Object or Object.prototype?
我刚刚学习了Javascript中的原型(不是框架,而是原生特性)。我至少完全掌握了它的一种用法。例子:
Array.prototype.myMethod = function(){
/*do something super awesome*/
}
var a = [];
a.myMethod();
继续读下去,我遇到了一个例子,作者在对象对象中添加了子类方法,方法如下:
Object.subClass = function(hash){/*return an extended object that inherits Object's attributes*/}
目标是创建一个类似于面向对象语言语法的方法。因为我期望书的作者使用原型特性来定义这样的方法,所以我的问题是:
- 为什么不使用prototype? 直接将方法添加到对象而不是将原型附加到对象上不是更有风险吗?
- 在某些情况下我更喜欢一种方式而不是另一种方式
为什么不使用prototype?
因为如果使用了prototype,那么subClass
方法只在Object
的实例上可用。例如,要调用subClass
,必须使用以下命令:
Object.prototype.subClass = function(hash) { /* return an extended object that inherits Object's attributes */ };
function MyClass() { };
var myInstance = new MyClass();
var mySubClassInstance = myInstance.subClass(); // only accessible on instances
这没有多大意义,因为作者希望subClass
返回对象的扩展实例。目的不是创建父"类"的实例,然后从该实例返回一个新的子实例。这是不必要的。
通过在Object
上定义它,可以在不首先创建MyClass
实例的情况下创建subClass
实例:
Object.subClass = function(hash) { /* return an extended object that inherits Object's attributes */ };
function MyClass() { };
var mySubClassInstance = MyClass.subClass();
直接向对象添加方法不是比将原型附加到对象上更有风险吗?在某些情况下,我是否更喜欢其中一种方式?
- Add to prototype向该对象的实例添加成员。
- Add to the object向该对象添加成员(类似于静态成员的思想)。
如果您希望方法能够访问类实例(使用this
关键字),请使用prototype。如果您不需要this
,则将function声明为类本身的成员,这样您就可以在没有对象的情况下调用它。
相关文章:
- Object.prototype using 'this'
- ExtJS 4 Object.prototype fail
- Object.prototype.hasOwnProperty.call() vs Object.prototype.h
- 为什么使用 Object.prototype.hasOwnProperty.call(myObj, prop) 而不是
- 如何添加 Object.prototype.x?设置为 enumerable:false
- 为什么 Object.prototype 和 Object.getOwnPropertyNames(Object.pro
- 引用 Object.prototype.toString.call 导致“TypeError: undefined 不是
- Object.seal(Object.prototype)是否使所有对象不可变?
- Object.Prototype 方法和 IIFE(立即调用的函数表达式)中的“use strict”
- Object.prototype.values 会破坏应用程序
- object.key = fn() 与 object.prototype.key = fn() 之间的差异
- 有没有办法从某人更改Object.prototype.hasOwnProperty中恢复
- JavaScript 中 Function.prototype 和 Object.prototype 之间的区别
- 为什么 Object.prototype.toString 返回 [object Object]
- Symbol.toPrimitive vs Object.prototype.valueOf
- Object.prototype is Verboten?
- Object.prototype.__defineGetter__(和__defineSetter__)填充物
- Object.prototype.toString.call(currentFruit) === "[obje
- Getting Object.prototype.hasOwnProperty() key
- 直接访问原型的值,即 Object.prototype.toString.call()