WEB开发网
开发学院网页设计JavaScript javascript中的继承 阅读

javascript中的继承

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 现在我们可以分析下 jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau"); 调用这句时,都发生了什么: 1 当js看见new操作

现在我们可以分析下

jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau");

调用这句时,都发生了什么:

1  当js看见new操作符,它创建一个新的普通对象,并且设置它的__proto__ 属性为Engineer.prototype。

2 new 操作符传递这个新的对象作为Engineer 构造器的this的值。

其实最主要做的事就是上面的两件,剩下的都是很简单的函数调用.

我们来看一下在继承中,假设你要存取一个对象的一个属性时会发生什么:

1 首先检测这个值是否在本地存在。

2 如果不存在本地变量,那么就检测prototype chain (使用__proto__ )。

3 如果属性在prototype chain中存在那么就返回这个值,否则这个对象就不存在这个值。

比如下面的例子:

function Employee () { 
  this.dept = "general"; 
} 
Employee.prototype.name = ""; 
 
function WorkerBee () { 
this.projects = []; 
} 
WorkerBee.prototype = new Employee; 
 
amy = new WorkerBee; 
 
Employee.prototype.name = "Unknown"; 

可以看到打印出Unknown.

通过上面我们知道当你使用new操作符创建一个对象的时候,js会设置这个对象的__proto__作为构造器函数的prototype ,因此我们能够通过这个来测试prototype chain。

假设我们创建了一个chris 对象:

chris = new Engineer("Pigman, Chris", ["jsd"], "fiji");

那么下面的语句都会返回true:

chris.__proto__ == Engineer.prototype; 
chris.__proto__.__proto__ == WorkerBee.prototype; 
chris.__proto__.__proto__.__proto__ == Employee.prototype; 
chris.__proto__.__proto__.__proto__.__proto__ == Object.prototype; 
chris.__proto__.__proto__.__proto__.__proto__.__proto__ == null;

最后要说的是,在js中并没有提供多重继承.

不过我们可以这样模拟实现:

function Hobbyist (hobby) { 
  this.hobby = hobby || "scuba"; 
} 
 
function Engineer (name, projs, mach, hobby) { 
  this.base1 = WorkerBee; 
  this.base1(name, "engineering", projs); 
  this.base2 = Hobbyist; 
  this.base2(hobby); 
  this.machine = mach || ""; 
} 
Engineer.prototype = new WorkerBee; 
 
dennis = new Engineer("Doe, Dennis", ["collabra"], "hugo") 

这样做不是很好,这是因为每次new的时候都会分配Hobbyist的空间。

可是如果我们给Hobbyist添加一个属性的话,dennis 对象将不能继承这个新的属性.

上一页  1 2 3 

Tags:javascript 继承

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