autho: selfimpr
blog: http://blog.csdn.net/lgg201
mail: [email protected]
本文博客地址: http://blog.csdn.net/lgg201/archive/2011/02/15/6185846.aspxjavascript中继承的做法:
1. 子类构造器中以自身对象作为宿主对象对父类进行调用.
function User(username, password) {
this.username = username;
this.password = password;
}
function Admin(username, password, auth) {
User.apply(this, arguments);
this.auth = auth;
}
//当然, 这里面的调用是可以更换为call, 或者直接传递参数的方式, 比如:
function Admin(username, password, auth) {
User.call(this, username, password);
this.auth = auth;
}
//或者
function Admin(username, password, auth) {
this.__constructor = User;
this.__constructor(username, password);
delete this.__constructor;
this.auth = auth;
}
2. 原型链: 上面的方法对于父类在构造器外通过prototype设置的成员是无法继承的, 而原型链的方式能够解决这个问题, 并且, 从语法角度来看, 这才是真正的继承, 因为instanceof能够检测到子类对象和父类存在关系. 当然, 这种方式是有缺点的, 那就是只能单继承
function User(username, password) {
this.username = username;
this.password = password;
}
User.prototype.login = function() {
alert('user ' + this.username + ' login success');
}
function Admin(username, password, auth) {
User.apply(this, arguments);
this.auth = auth;
}
//这里创建一个父类对象, 作为子类的prototype
Admin.prototype = new User();
Admin.prototype.login = function() {
alert('admin [' + this.username + '] login success, your authentication is: ' + this.auth);
}
var admin = new Admin('admin', 'admin', 1986);
//这里我们测试的是重写父类方法
admin.login();
//这里我们测试的是instanceof检测
alert("admin instanceof Admin: " + (admin instanceof Admin));
alert("admin instanceof User: " + (admin instanceof User));
3. 上面的原型链方式其实有一点不足, 那就是当我们创建一个Admin的对象之后, 然后获取它的constructor, 得到的是User构造器, 而理想情况下, 这应该是Admin的构造器. 所以, 我们需要对上面的继承再进行少许的修改: 在子类构造器中保留对象对自己构造器的引用
代码如下:
function User(username, password) {
this.username = username;
this.password = password;
}
User.prototype.login = function() {
alert('user ' + this.username + ' login success');
}
function Admin(username, password, auth) {
User.apply(this, arguments);
this.auth = auth;
//这里保留一次自己的构造器引用
this.constructor = arguments.callee;
}
//这里创建一个父类对象, 作为子类的prototype
Admin.prototype = new User();
Admin.prototype.login = function() {
alert('admin [' + this.username + '] login success, your authentication is: ' + this.auth);
}
var admin = new Admin('admin', 'admin', 1986);
//这里我们测试的是重写父类方法
admin.login();
//这里我们测试的是instanceof检测
alert("admin instanceof Admin: " + (admin instanceof Admin));
alert("admin instanceof User: " + (admin instanceof User));
//检测对象的构造器是否合适
alert(admin.constructor);
blog: http://blog.csdn.net/lgg201
mail: [email protected]
本文博客地址: http://blog.csdn.net/lgg201/archive/2011/02/15/6185846.aspxjavascript中继承的做法:
1. 子类构造器中以自身对象作为宿主对象对父类进行调用.
function User(username, password) {
this.username = username;
this.password = password;
}
function Admin(username, password, auth) {
User.apply(this, arguments);
this.auth = auth;
}
//当然, 这里面的调用是可以更换为call, 或者直接传递参数的方式, 比如:
function Admin(username, password, auth) {
User.call(this, username, password);
this.auth = auth;
}
//或者
function Admin(username, password, auth) {
this.__constructor = User;
this.__constructor(username, password);
delete this.__constructor;
this.auth = auth;
}
2. 原型链: 上面的方法对于父类在构造器外通过prototype设置的成员是无法继承的, 而原型链的方式能够解决这个问题, 并且, 从语法角度来看, 这才是真正的继承, 因为instanceof能够检测到子类对象和父类存在关系. 当然, 这种方式是有缺点的, 那就是只能单继承
function User(username, password) {
this.username = username;
this.password = password;
}
User.prototype.login = function() {
alert('user ' + this.username + ' login success');
}
function Admin(username, password, auth) {
User.apply(this, arguments);
this.auth = auth;
}
//这里创建一个父类对象, 作为子类的prototype
Admin.prototype = new User();
Admin.prototype.login = function() {
alert('admin [' + this.username + '] login success, your authentication is: ' + this.auth);
}
var admin = new Admin('admin', 'admin', 1986);
//这里我们测试的是重写父类方法
admin.login();
//这里我们测试的是instanceof检测
alert("admin instanceof Admin: " + (admin instanceof Admin));
alert("admin instanceof User: " + (admin instanceof User));
3. 上面的原型链方式其实有一点不足, 那就是当我们创建一个Admin的对象之后, 然后获取它的constructor, 得到的是User构造器, 而理想情况下, 这应该是Admin的构造器. 所以, 我们需要对上面的继承再进行少许的修改: 在子类构造器中保留对象对自己构造器的引用
代码如下:
function User(username, password) {
this.username = username;
this.password = password;
}
User.prototype.login = function() {
alert('user ' + this.username + ' login success');
}
function Admin(username, password, auth) {
User.apply(this, arguments);
this.auth = auth;
//这里保留一次自己的构造器引用
this.constructor = arguments.callee;
}
//这里创建一个父类对象, 作为子类的prototype
Admin.prototype = new User();
Admin.prototype.login = function() {
alert('admin [' + this.username + '] login success, your authentication is: ' + this.auth);
}
var admin = new Admin('admin', 'admin', 1986);
//这里我们测试的是重写父类方法
admin.login();
//这里我们测试的是instanceof检测
alert("admin instanceof Admin: " + (admin instanceof Admin));
alert("admin instanceof User: " + (admin instanceof User));
//检测对象的构造器是否合适
alert(admin.constructor);
解决方案 »
- jsp页面 如下的图标如何显示
- javascript让键盘自己按下你会吗
- javascript 三目条件运算的问题
- 请教个仿QQ邮箱之类的多收件人列表鼠标移上去就选择当前收件人的JS脚本
- window.close()问题
- 超难: div onclick的问题
- 用JS得到smarty上的下拉框值
- 快疯了!IE6.00.2462真变态呀!我在本机做的测试,为什么不能禁止HTML缓存?
- 如何写一段javascript代码放在网页上, 知道正在访问该网页的人数? 急!!!!!!!!
- 请问如何用java Script 解析URL?
- 如何打开一个page替换当前的masterpage
- JQuery简单问题 按属性获取对象
这个没必要这样吧,每次实例化都分配一个对象属性
一般是
Admin.prototype = new User();
Admin.prototype.constructor = Admin
是昨天写一个小测试的时候需要用到constructor, 今天看到一个继承的文章, 就细看了下继承的过程...
比较方便。
也有自己定义继承方法的。
Child.extends = function(Super){
var $ = new Super;
for(var p in $)if(!$.hasOwnProperty(p))this[p] = $[p];
}
var extends = function(Super,Child){
var $ = new Super;
for(var p in $)if(!$.hasOwnProperty(p))Child.prototype[p] = $[p];
}
可以借鉴下他里面的创建对象的写法