轻量高效的拓扑图组件
zh

JavaScript类继承与属性定义

2013-05-20

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

Next Prev