Javascript快速原型继承
Javascript fast prototypal inheritance?
我正在学习JavaScript,我发现它的原型继承太冗长了。所以我搜索了一些替代方案,但我发现的所有内容都使用了闭包,并因此显著降低了性能。
我试着自己写,结果似乎奏效了。也许我误解了什么,也许出于某种原因,这被认为是不好的做法。有经验的人能分享他对这种方法的想法吗?
var Class = {
constructor: function() {},
extend: function(properties) {
var base = this.prototype || Class;
var constructor = properties.hasOwnProperty('constructor') ?
properties.constructor : base.constructor;
constructor.base = base;
constructor.prototype = Object.create(base);
constructor.extend = Class.extend;
for(var p in properties) {
constructor.prototype[p] = properties[p];
}
constructor.prototype.constructor = constructor;
return constructor;
}
};
现场演示:http://jsfiddle.net/xNGAB/
性能:http://jsperf.com/object-construction99/2
EDIT:有一件事我仍然觉得很笨拙,那就是对基类函数的调用,比如C.base.constructor.call(this);
。我真的不明白为什么当我们做C.base.constructor()
时,this
没有得到正确的绑定。
您应该看看CoffeeScript。它具有类似Ruby的语法,并可编译为JavaScript。最好的部分是你可以实现这样的原型继承(来自他们的用户手册):
class Animal
constructor: (@name) ->
move: (meters) ->
alert @name + " moved #{meters}m."
class Snake extends Animal
move: ->
alert "Slithering..."
super 5
class Horse extends Animal
move: ->
alert "Galloping..."
super 45
sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"
这个问题已经得到了回答,但只是为javascript的微面向对象框架提供了另一个视角,这里是:
https://github.com/foo123/classy.js
它还支持sweet.js
宏(以及es5/es6高级功能),从而产生类似于Java或PHP的OOP语法糖,无论是语法还是功能
PS。我是的作者
classy.js的jsperf性能测试(以及类似的方法,例如@ejohn的面向对象方法)
相关文章:
- JavaScript对象不是从原型链继承的
- 如何使用原型继承编写一个整洁灵活的复杂javascript应用程序
- $emit,$broadcast,原型继承
- Javascript:继承原型而不重新定义构造函数
- 原型继承未按预期工作
- JavaScript中的原型继承.我可以称之为“超级”等价物吗?
- 为什么函数对象的实例没有继承函数原型属性
- 不创建父对象的原型继承
- Javascript基本继承与Crockford原型继承
- JavaScript-构造函数参数和原型继承
- 使用Object.create作为原型的原型继承将[Object]作为实例的原型
- javascript继承中正确的原型做作是什么
- 如何进行JavaScript原型继承(原型链)
- Javascript原型继承原型函数调用
- 对象不继承原型函数
- 从其他类继承原型方法,而不重写自己的原型方法
- JavaScript继承原型
- 继承原型
- Javascript继承/原型混淆
- 使用.call(this)继承原型