JavaScript类继承与属性定义
Extjs的类继承——$.extend
Extjs是比较早期的web企业组件,代表了面向对象编程思想在js中的实践,其中最基本的就是类的继承,通过对prototype和constructor的复制和设置实现,但实现代码并不是那么容易,看过extjs的extend代码就会明白其难度,没有相当js经验很难看懂,当年看这块儿费了不少精力,后来考虑到版权问题,以及代码简化的需要,自己实现相关功能,经历几番修改才得以稳定 下面是最简化的实现,以及测试例子,当然这个实现存在些问题,比如对于javascript 1.8中的get set不支持,需要自行改造
function extend(sb, sp) {
var sbp = sb.prototype;
var F = function() { };
F.prototype = sp.prototype;
sb.prototype = new F();
sp.prototype.constructor = sp;
for (var name in sbp) {
sb.prototype[name] = sbp[name];
}
}
//test
function A() { }
A.prototype.name = "A";
function B() { }
extend(B, A);
var a = new A();
var b = new B();
console.log(b.name == "A");
console.log(b instanceof B);
console.log(b instanceof A);
打印结果全为true
JavaScript 1.8
到HTML5,出现了很多新的东西,很多高级应用不再考虑IE6,甚至IE7, 8,主流浏览器开始支持JavaScript 1.8,增加了新功能,支持严格模式-“use strict”,而getter, setter也有了更多的实现方式
Getter/Setter
get set语法
首先是直接语法上的支持,写法类似ActionScript
var foo = {
get test(){ return this._test; },
set test(value){
console.log(value);
this._test = value;
}
};
foo.test = "abc";
函数支持 - Object.defineProperty/ defineProperties
此外还可以通过函数调用的方式实现,Object上定义了一些有用的方法,可以实现类的构造,函数扩展,属性扩展等功能,详见:https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects 示例:
var Canvas = function(){};
Object.defineProperties(Canvas.prototype, {
name: {
get: function(){
return this._name;
},
set: function(value){
console.log(value);
this._name = value;
}
}
});
var g = new Canvas();
g.name = "Qunee.com";
这里需要注意两点:
- 只支持Object - 而不能是Function,比如上面的例子,只能是Canvas.prototype而不是Canvas
- 部分属性名不可使用 - 比如"length"
严格模式 - “use strict”;
严谨模式就是在代码前加上下面这行代码:
"use strict";
“strict mode"限制了一些不安全的语法,使代码可读性增加,更便于调试,此外js引擎可以完全抛开老的兼容语法,从而提升性能 可参阅这篇文章:http://www.alloyteam.com/2012/06/it-is-time-to-use-the-javascript-strict-mode-strict-mode-to-enhance-the-efficiency-of-team-development/ 详见:https://developer.mozilla.org/en/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode