WEB开发网
开发学院网页设计JavaScript JavaScript中的原型和对象机制 阅读

JavaScript中的原型和对象机制

 2009-09-23 00:00:00 来源:WEB开发网   
核心提示: 2.2 原型链除了能修改prototype指向的对象, 还能修改prototype指向哪一个对象, 即为prototype赋予一个不同的对象. 这可以实现一种简单的继承:functionSuperman(){}Superman.prototype.sayHello=function(){aler

2.2 原型链

除了能修改prototype指向的对象, 还能修改prototype指向哪一个对象, 即为prototype赋予一个不同的对象. 这可以实现一种简单的继承:

function Superman() {}
Superman.prototype.sayHello = function(){
    alert("I'm a superman.");
}
function SupermanCan(skill){
    this.skill = skill;
}
// 为prototype赋予Superman的实例..
SupermanCan.prototype = new Superman();
// ..再动态添加新的属性
SupermanCan.prototype.sayMore = function(){
    this.sayHello(); // 调用"父类"的方法
    alert("I can " + this.skill);
}
var david = new SupermanCan("fly");
// output: I'm a superman. I can fly
david.sayMore();

如果先实例化出一个对象, 再为构造函数prototype赋予一个不同的对象, 将会: 已经创建的对象的基引用不变, 将来创建的对象的基引用为新的原型对象:

var f1 = {echo: function() { alert("sound"); } };
function Foo() {};
var foo = new Foo(); // foo的基引用指向Object实例
Foo.prototype = f1;
/* 未定义, 因为这是"foo对象自己或者基引用指向的对象有echo属性吗?"
   而不是"foo对象自己或者Foo.prototype指向的对象有echo属性吗?" */
alert(foo.echo);
var foo2 = new Foo(); // foo2的基引用指f1对象
foo2.echo(); // output: sound

所有的构造函数的prototype都不能为空, 就是说Superman.prototype = null 会被解释引擎无视;  另一方面, Object构造函数也有prototype属性(该属性是只读的, 可以为原型增加属性,但不能赋予不同的对象), 故因此可以有多层的原型链, 但原型链的根必定会是Object.prototype . 这意味着给Object.prototype增加属性影响到所有对象:

上一页  1 2 3 4  下一页

Tags:JavaScript 原型 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接