您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

JavaScript进阶系列—原型

2024/2/28 4:05:20发布19次查看
属性查找
原型属性
性能
扩展内置类型的原型
总结
javascript 不包含传统的类继承模型,而是使用 prototype 原型模型。
经常被当作是 javascript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大。 实现传统的类继承模型是很简单,但是实现 javascript 中的原型继承则要困难的多。 (it is for example fairly trivial to build a classic model on top of it, while the other way around is a far more difficult task.)
javascript 是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的。
不同之处在于 javascript 使用原型链的继承方式。
function foo() { this.value = 42; } foo.prototype = { method: function() {} }; function bar() {} // 设置bar的prototype属性为foo的实例对象 bar.prototype = new foo(); bar.prototype.foo = 'hello world'; // 修正bar.prototype.constructor为bar本身 bar.prototype.constructor = bar; var test = new bar() // 创建bar的一个新实例 // 原型链 test [bar的实例] bar.prototype [foo的实例] { foo: 'hello world' } foo.prototype {method: ...}; object.prototype {tostring: ... /* etc. */};
上面的例子中,test 对象从 bar.prototype 和 foo.prototype 继承下来;因此, 它能访问 foo 的原型方法 method。同时,它也能够访问那个定义在原型上的 foo 实例属性 value。 需要注意的是 new bar() 不会创造出一个新的foo 实例,而是 重复使用它原型上的那个实例;因此,所有的bar 实例都会共享相同的 value 属性。
属性查找
一个对象的属性时,javascript 会向上遍历原型链,直到找到给定名称的属性为止。
到达原型链的顶部 - 也就是 object.prototype - 但是仍然没有找到指定的属性,就会返回 undefined。
注意:不要使用bar.prototype = foo,因为这不会执行 foo 的原型,而是指向函数 foo。 因此原型链将会回溯到function.prototype 而不是foo.prototype,因此method 将不会在 bar 的原型链上。
原型属性
属性用来创建原型链时,可以把任何类型的值赋给它(prototype)。 然而将原子类型赋给 prototype 的操作将会被忽略。
function foo() {} foo.prototype = 1; // 无效
而将对象赋值给 prototype,正如上面的例子所示,将会动态的创建原型链。
性能
如果一个属性在原型链的上端,则对于查找时间将带来不利影响。特别的,试图获取一个不存在的属性将会遍历整个原型链。
并且,当使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问。
扩展内置类型的原型
一个错误特性被经常使用,那就是扩展 object.prototype 或者其他内置类型的原型对象。
这种技术被称之为 monkey patching 并且会破坏封装。虽然它被广泛的应用到一些 javascript 类库中比如 prototype, 但是我仍然不认为为内置类型添加一些非标准的函数是个好主意。
扩展内置类型的唯一理由是为了和新的 javascript 保持一致,比如array.foreach。
总结
在写复杂的 javascript 应用之前,充分理解原型链继承的工作方式是每个 javascript 程序员必修的功课。 要提防原型链过长带来的性能问题,并知道如何通过缩短原型链来提高性能。 更进一步,绝对不要扩展内置类型的原型,除非是为了和新的 javascript 引擎兼容。
注:这是编程领域常用的一种方式,称之为 backport,也就是将新的补丁添加到老版本中。
以上就是javascript进阶系列—原型的内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product