类与继承的出现,主要也是解决Js大规模的开发;
之前eb4就开始引入类和模块;javascript并没有真正意义的类;不过咱们可以模拟类;
javascript类的实例也是通过 new 操作符创建的,并且它的所有函数都可以作为构造器。构造器和普通的方法并没有什么区别;
为什么使用类呢?
显然实现集成关系方便一些方法或者属性的共享;在javascript的生态圈中 Node,Element,HTMLElement,HTMLparaphElement;Node是基于Object对象;Element基于Node…;
javascript是怎么实现类之前的关系呢?
javascript从其他语言借鉴了原型的机制,prototype作为特殊的对象属性存在每一个函数上,当一个函数通过 new 操作符实例出的对象就拥有这个对象函数的prototype对象的一切成员;从而实现对象都共享一组方法和属性;而javascript的“类”就是修改这个prototype对象,以区别原生对象和其他自定义的“类”;
注意 :必须重申,方法和属性没有被复制到原型链中的其他对象——它们只是通过前述的“上溯原型链”的方式访问。没有正式的方法用于直接访问一个对象的原型对象——原型链中的“连接”被定义在一个内部属性中,在 JavaScript 语言标准中用 [[prototype]] 表示(参见 ECMAScript)。然而,大多数现代浏览器还是提供了一个名为proto(前后各有2个下划线)的属性,其包含了对象的原型。
举例说明原型链的调用说明;
person1.valueOf()
这个方法仅仅返回了被调用对象的值。在这个例子中发生了如下过程:
1.浏览器首先检查,person1 对象是否具有可用的 valueOf() 方法。
2.如果没有,则浏览器检查 person1 对象的原型对象(即 Person)是否具有可用的 valueof() 方法。
3.如果也没有,则浏览器检查 Person() 构造器的原型对象(即 Object)是否具有可用的 valueOf() 方法。Object 具有这个方法,于是该方法被调用,
下面我们将用代码实现类的重写和共享;
// 第一种原型写法
var person = function (){};
//1.使用对象字面量来设定
person.prototype={
say:function(){
console.log("I say ....");
}
}
//2.在赋值原型prototype的时候使用function立即执行的表达式来赋值,即如下格式:
person.prototype= function(){
var walk = function(){
console.log("I walk ....");
}
return {
walk:walk
}
}();
//学生
var Student = function(){
}
var p1 = new person();
var p2 = new person();
Student.prototype = new person();
Student s = new Student();
s.walk();//I walk ....
console.log(p1.eyes === p2.eyes); //true
console.log(p1.eyes === p2.eyes); //true