javascript面向对象继承方式分享
1、javascript的大段文本块声明
1 $(document).ready(
2 function ()
3 {
4 var str = '\
5 helo me fdsaf fdsaf\
6 me\
7 \
8 test\
9 ';
10 alert(str);
11 }
12 );
13
2 function ()
3 {
4 var str = '\
5 helo me fdsaf fdsaf\
6 me\
7 \
8 test\
9 ';
10 alert(str);
11 }
12 );
13
这个和@大大柳树 曾经遇到过该问题。
2、Douglas Crockford实现的一个巧妙地类模式的继承。加了些注释方便理解。
理解这段函数需要的基础知识
(1)、Function.prototype增加一个公有方法。所有由类的扩充的函数都可以使用它。它有一个名称和一个函数,并把它们增加到了函数的prototype上。
(2)、if,while 这些需要判断函数的语句,数字0作为条件转换为false,>0转换为true。
实现继承函数
//辅助方法
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
//比较复杂的函数= =
//可以实现快捷的继承。也可以让选择性的调用父对象的函数。
Function.method('inherits', function (parent) {
var d = {};
this.prototype = new parent();
var p = this.prototype;
//一个特权方法可以调用父类的方法。
this.method('uber', function uber(name) {
//判断该方法是否存在
if (!(name in d))
{
d[name] = 0;
}
var f, r, t = d[name], v = parent.prototype;
//是否执行过
if (t)
{
//如果有执行过
while (t)
{
v = v.constructor.prototype;
t -= 1;
}
f = v[name];
}
//首次执行
else
{
f = p[name];
//如果指向当前原型的方法,调用父对象的方法
if (f == this[name])
{
f = v[name];
}
}
//巧妙而恶心的调用堆栈记录
d[name] += 1;
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
//比较复杂的函数= =
//可以实现快捷的继承。也可以让选择性的调用父对象的函数。
Function.method('inherits', function (parent) {
var d = {};
this.prototype = new parent();
var p = this.prototype;
//一个特权方法可以调用父类的方法。
this.method('uber', function uber(name) {
//判断该方法是否存在
if (!(name in d))
{
d[name] = 0;
}
var f, r, t = d[name], v = parent.prototype;
//是否执行过
if (t)
{
//如果有执行过
while (t)
{
v = v.constructor.prototype;
t -= 1;
}
f = v[name];
}
//首次执行
else
{
f = p[name];
//如果指向当前原型的方法,调用父对象的方法
if (f == this[name])
{
f = v[name];
}
}
//巧妙而恶心的调用堆栈记录
d[name] += 1;
//这个函数也很巧妙,arguments不是一个真正的数组,所以必须再一次使用apply来调用数组的slice的方法。
r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
alert(d[name]);
return r;
});
return this;
});
//只继承父类特定函数的辅助函数
Function.method('swiss', function (parent) {
for (var i = 1; i < arguments.length; i += 1)
{
var name = arguments;
this.prototype[name] = parent.prototype[name];
}
return this;
}
alert(d[name]);
return r;
});
return this;
});
//只继承父类特定函数的辅助函数
Function.method('swiss', function (parent) {
for (var i = 1; i < arguments.length; i += 1)
{
var name = arguments;
this.prototype[name] = parent.prototype[name];
}
return this;
}
调用代码
function User() {
this.name = "user";
}
User.method("sayYouName", function () { alert("from:" + this.name); });
function Man() {
this.name = "man";
}
Man.inherits(User);
Man.method("sayYouName",
function () {
this.uber("sayYouName");
alert("and i am man");
});
this.name = "user";
}
User.method("sayYouName", function () { alert("from:" + this.name); });
function Man() {
this.name = "man";
}
Man.inherits(User);
Man.method("sayYouName",
function () {
this.uber("sayYouName");
alert("and i am man");
});
3、dean edwards base.js的类继承方式
这个类继承的方式会更优雅些,如果方法被覆盖的情况下更是如此,只需this.base调用即可。不用显示写出方法名
代码
//base.js begin
var Star = Base.extend({
constructor: function (name) {
this.name = name;
},
name: "",
say: function (message) {
alert(this.name + ": " + message);
}
});
var Sun = Star.extend({
say: function (message) {
this.base(message);
alert("base over");
}
});
var Star = Base.extend({
constructor: function (name) {
this.name = name;
},
name: "",
say: function (message) {
alert(this.name + ": " + message);
}
});
var Sun = Star.extend({
say: function (message) {
this.base(message);
alert("base over");
}
});
调用代码
(new Sun("tom")).say("hello world!");