作者TonyQ (沉默是金。)
看板Ajax
标题Re: [ js ] 几种 define class 的 patterns
时间Wed Mar 23 03:10:11 2011
※ 引述《B9 (叶酸酸)》之铭言:
: 1. 定义 function 再把 method 加到 prototype 里面。
: function Cat(){}
: Cat.prototype.eat = function(){};
: Cat.prototype.drink = function(){};
: constructor 当然可以像下面这样写。
: var Cat = function(){};
: 不过我个人喜欢下面这样写,因为比较像传统 OOP 定义 class 的方法:
: function Cat()
: {
: arguments.callee.prototype.eat = function(){};
: arguments.callee.prototype.drink = function(){};
: }
It's not good , every time you new a instance ,
it need to re-allocate again , and you couldn't overwrite it anyway.
Because every time you new a object,
the prototype is writing again.
(you might not need it , but it's still bad for performance.)
: > -------------------------------------------------------------------------- <
: 2. 与第一型一样定义 function,但重新定义 prototype object。
: function Cat(){}
: Cat.prototype =
: {
: eat: function(){},
: drink: function(){}
: }
I prefer this one , it's nature and effective.
: > -------------------------------------------------------------------------- <
: 3. 在 Function 的 prototype object 中新增一个宣告 method 的 function,
: 再利用这个 function 宣告 methods。
: Function.prototype.method = function(name, fn){ this.prototype[name] = fn; };
: function Cat(){}
: Cat.method("eat", function(){});
: Cat.method("drink", function(){});
Not native enough...
but it's good to do some overwrite job or method fn queue if need.
: > -------------------------------------------------------------------------- <
: 4. 与第三型相似,但透过小小改写,变成 chaining pattern。
: Function.prototype.method = function(name, fn){
: this.prototype[name] = fn;
: return this;
: };
: Cat.method("eat", function(){}).method("drink", function(){});
: > -------------------------------------------------------------------------- <
: 5. 如果你的 class 只有一个物件的话,可以考虑 singleton。
: var Cat =
: {
: eat: function(){},
: drink: function(){}
: };
: > -------------------------------------------------------------------------- <
: 这是 JavaScript 的美。:D
If you are talking about all the approach,
there's another way for not to use prototype ,
like
function Cat(){
this.eat = function(){};
this.drink = function(){};
}
var c1 = new Cat();
var c2 = new Cat();
(it's still bad for performance, and not extendable after it created.)
--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 198.203.175.175
※ 编辑: TonyQ 来自: 198.203.175.175 (03/23 03:16)
1F:推 linhomeyeu:tony大的中文输入挂点了吗XD 03/23 06:54
2F:→ TonyQ:我在美国出差,有时没中文输入法可以用XD 03/23 07:52
3F:推 B9:Thank you really much. :) 03/23 20:47
4F:推 gpmm:prefer XDDD 03/23 21:55
※ 编辑: TonyQ 来自: 198.203.175.175 (03/23 22:17)
※ 编辑: TonyQ 来自: 198.203.175.175 (03/23 22:18)