将oop模块永久更名为class模块,移除一些nonew,unnew这两个配置属性,想使用无new实例化可以通过如下方法实现:
dom(function(){
var test = function(name){
return new test.fn.init(name)
}
dom.mix(test, dom["class"]).include({
init:function(name){
console.log("=============")
this.name = name;
},
getName:function(){
return this.name
},
setName:function(name){
this.name = name
}
});
test.fn = test.prototype;
test.fn.init.prototype = test.fn;
var a = test("司徒正美")
alert(a.getName())
});
新增setOptions API.
在Prototype中,我们重新一个类的属性,通常使用如下的格式:
this.options = {
method: 'post',
asynchronous: true,
contentType: 'application/x-www-form-urlencoded',
encoding: 'UTF-8',
parameters: '',
evalJSON: true,
evalJS: true
};
Object.extend(this.options, options || { });
在jquery中,可能就是这样,从理论上来使用深拷贝应该更安全,不过这也视情况而定。
this.options = {
method: 'post',
asynchronous: true,
contentType: 'application/x-www-form-urlencoded',
encoding: 'UTF-8',
parameters: '',
evalJSON: true,
evalJS: true
};
this.options = $.extend(true,{}, this.options, options );
我的框架与mootools走的是同一路线,专门提供一个方法干这事情:
dom.require("class",function(){
var A = dom.factory({
options:{aaa:"1111"},
init:function(){
this.setOptions({
aaa:"aaa",
bbb:"bbb",
ccc:"ccc"
});
}
});
var a = new A;
dom.log(a.options)
});
//by 司徒正美 2011.7.4
;(function(global,DOC){
var dom = global[DOC.URL.split("#")[0]];
dom.define("class", "lang",function(){
//=========================================
// 核心模块 第一类工厂
//==========================================
var
P = "prototype", C = "constructor", F = "function",
EXTEND = [P, 'extend', 'include', 'inherit', 'ancestors', 'parent'],
INCLUDE = [C],
classOne = dom.oneObject(['Object',"Array","Function"]),
objectEach = dom.Object2.forEach;
function addModule(klass,props){
'extend,include'.replace(/\w+/g, function(name){
var modules = props[name];
if(classOne[dom.type(modules)]){
klass[name].apply(klass,[].concat(modules));
delete props[name];
}
});
}
function cleanModule(module,props){
for(var i = 0, name ; name = props[i++];){
delete module[name]
}
return module;
}
dom["class"] = {
inherit : function(parent) {
if (parent && parent[P]) {
this[P] = Object.create(parent[P]);//高效设置原型链
this.parent = parent;
}
this.ancestors = [];
while (parent) {//收集所有父类,用于构建方法链时查找同名方法
this.ancestors.push(parent);
parent = parent.parent;
}
this[P].setOptions = function(){
this.options = dom.Object2.merge.apply(this.options || {}, arguments)
return this;
}
return this[P][C] = this;
},
extend: function(){//扩展类成员
for(var i = 0, module; module = arguments[i++]; ){
if(module){
dom.mix(this, cleanModule(module,EXTEND))
}
}
return this;
},
include:function(){//扩展原型成员
var parents = [this].concat(this.ancestors), target = this[P],modules = [];
for(var i = 0, module; module = arguments[i++]; ){
if(dom.type(module,"Object")){
modules.push(module);
}else if(typeof module === F){
modules.push(new module);
}
}
modules.forEach(function(module){
objectEach.call(cleanModule(module,INCLUDE),function(method,name){
var i = 0,parent,super_method;
while((parent = parents[i++])){
if (parent[P] && name in parent[P]) {
super_method = parent[P][name];
break;
}
}
if( typeof method === F && typeof super_method === F ){
target[name] = function() {
this.$super = super_method;
return method.apply(this, arguments);
}
target[name].toString = dom.K(method + "");
}else{
target[name] = method;
}
});
});
return this;
}
};
dom.factory = function(obj){
obj = obj || {};
var parent = obj.inherit || {}; //父类
var init = obj.init || function(){};
delete obj.inherit;
delete obj.init;
var klass = function() {
parent.apply && parent.apply(this, arguments);
return init.apply(this, arguments);//确保有实例返回
};
dom.mix(klass,dom["class"]).inherit(parent ).extend(parent );
addModule(klass,obj);//添加obj.extend,obj.include里面的对象或类到类中去
klass.toString = dom.K(init+"");
return klass.include(obj);
}
});
})(this,this.document);