Js的 "继承"

时间:2024-01-10 15:49:32

Js 和 Java , C等语言不是很一样 . 其他语言有 类和实例 但是Js就比较特殊 , 所以 类和实例 只能说是大多数面向对象编程的语言的基本概念 .

Js比较特殊 , 它不去分类和实例的概念 .  而是通过原型(prototype)来实现面向对象编程  .

下面介绍Js中第一种用于继承的方法

var robot = {
name: 'Robot',
height: 1.6,
run: function () {
console.log(this.name + ' is running...');
}
};

这一段代码 , 声明了一个对象robot . 这个对象有姓名 , 身高(属性) , 还有自己的行为(方法) . 如果我们能根据这一个对象来建立另一个对象该是多么美好的事情呀 .

有需求就有产出 . 所以请看下面的代码 . 我们可以根据已经有的 "实例" 来声明一个新的 "实例"  .

var Student = {
name: 'Robot',
height: 1.2,
run: function () {
console.log(this.name + ' is running...');
}
}; var xiaoming = {
name: '小明'
}; xiaoming.__proto__ = Student;

可以看出 , 我们先写了一个Student的实例 , 然后谢了一个xiaoming的实例 . 最后我们讲小明的原型 (prototype) 指向了 Student . xiaoming有自己的name属性 , 但是没有run方法 , 然后从Student中继承下来 , 得到了 Student的run方法.

这个方法不建议使用 . 因为低版本的IE不支持 . 下面我们说一个真正用的继承 .

除了直接用 {...} 来创建一个对象之外 . Js 还有一种利用构造方法 , 来创建对象的方法 . 首先我们定义一个构造函数 .

function Student(name) {
this.name = name;
this.hello = function () {
alert('Hello, ' + this.name + '!');
}
}

... 这个是不是有点像普通的函数 ? 但是普通函数是不能直接写this的会报错 .  我们可以通过一个关键词 new 来调用这个函数将函数转变为 构造函数 , 然后去声明一个对象. .

var xiaoming = new Student('小明');
xiaoming.name; // '小明'
xiaoming.hello(); // Hello, 小明!

如果我们不写new 的话 this是指向undefined的 . 然后xiaoming.name也只会返回一个undefined . 但是如果我们写了new 这个普通的函数就会变成一个构造函数 . 然后在函数的末尾自动加上一个 . return this;

构造函数千万不要忘记写new 此外为了区分普通函数和构造函数 , 我们按照约定构造函数的首字母应该大写 . 在某些语法检查工具当中这样的好习惯会在你忘了写new的时候检测到并且提醒你写错了 .

在传统的面向对象语言如 C++ Java继承的本质是扩展一个现有的Class 生成一个Subclass . 由于这些语言严格区分类和实例 , 所以继承实际上是对类型的扩展 , 但是Js中由于采用原型继承,我们无法直接扩展一个类 , 因为根本就不存在Class这种类型(听起来Js还听骄傲?)

http://blog.csdn.net/hy1405430407/article/details/48626771