【废话】
面试时被经理问到其中一个问题让我印象很深刻,因为我想了很久没能答上来。题目是 JavaScript是怎样实现继承的? 面向对象是在开发过程中一直使用的,因此,继承也是最基础的一部分,自己开始接触JS到现在差不多两年多了,这个基础我竟然都没过关,看来我的理论功还要加大力度提升啊!!!我重新查了资料,终于深刻理解下来了。废话就这么多了,Coding Action...
【正文】
大家都知道,C#中使用的是传统的类继承是很简单,但在JS中,可就没这么简单了,因为它使用的是原型(prototype )继承,实现起来相对复杂了一点。
//定义 People 对象
var People = function () { };
People.prototype = {
Height: 175,
Walk: function () {
alert("People are walking...");
}
}
//定义 Me 对象
var Me = function () { };
//设置 Me 的 prototype 属性为 People 对象
Me.prototype = new People();
//将创建 Me 对象的引用指回给 Me
Me.prototype.constructor = Me;
//修改 Height 属性
Me.prototype.SetHeight = function (v) {
Me.prototype.Height = v;
}
//新增 Stop 动作
Me.prototype.Stop = function () {
alert("I'm Stop.");
}
var m = new Me();
//结果为 People are 175cm tall.
alert("People are " + m.Height + "cm tall.");
m.SetHeight(185);
//结果为 I'm 185cm tall.
alert("I'm " + m.Height + "cm tall.");
//结果为 People are walking...
m.Walk();
//结果为 I'm Stop.
m.Stop();
var y = new Me();
//结果为 You're 185cm tall.
alert("You're " + y.Height + "cm tall.");
从上面例子可以看出,Me对象即继承了People对象,可以访问People原型的属性和动作,又可以有Me自己的动作和属性。需特别注意的是,上面例子中实例化了一个y=new Me(),但显示它的Height属性时,并不是原始是175,而是被m实例修改后的185, 因此,new Me() 并不会创建一个新的People实现,而是重复使用它原型上的实例。因此上面例子,所有的Me对象都会共享相同的Height属性,这一点在继承使用中要特别留意。
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn