1. js的继承基于原型的继承
  2. 1. 构造函数的缺点
  3. 2. 这个问题的解决方法,就是JavaScript的原型对象(prototype

JS的继承是基于原型的继承

  • 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。
  • 大部分面向对象的编程语言,都是通过“类”(class)来实现对象的继承。JavaScript 语言的继承则是通过“原型对象”(prototype)。

    1. 构造函数(function new)

    JavaScript 通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定义在构造函数内部。
    构造函数 (es6之前如何实例化一个类,使用构造函数实现一个类)
    定义方法:1.就是构造一个对象的函数(Java—构造函数和类名是相同)
    2.使用new关键字去实例化对象
  1. <script>
  2. function Person(name,age){
  3. this.name= name;
  4. this.age = age
  5. }
  6. var liu = new Person("liuyushu",18);
  7. console.log(liu.name)
  8. </script>

tip:缺点:通过构造函数为实例对象定义属性,虽然很方便,但是有一个缺点。同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。

2. JavaScript的原型对象(prototype)

添加一个属性

  1. function Person(name,age){
  2. this.name= name;
  3. this.age = age
  4. }
  5. Person.prototype.sayName = function(){
  6. console.log(this.name)
  7. }
  8. var liu = new Person("liuyushu",18);
  9. console.log(liu.name)
  10. liu.sayName()
  1. 注意:
  2. 1.构造函数:就是构造一个对象的函数(Java--构造函数和类名是相同)
  3. 2.使用new关键字去实例化对象
  4. 3.在构造函数中 谁使用new关键字调用构造函数,this就指向谁

3.原型对象的理解

  1. function Person(){}
  2. Person.prototype.name = "Nicholas";
  3. Person.prototype.age = 29;
  4. Person.prototype.job = "Software Engineer";
  5. Person.prototype.sayName = function(){
  6. alert(this.name);
  7. }
  8. var person1 = new Person();
  9. person1.sayName() //"Nicholas"
  10. var person2 = new Person();
  11. person2.sayName() //"Nicholas"
  12. alert(person1.sayName==person2.sayName)//true
  1. 只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。
  2. 在默认情况下,所有原型对象都会自动获取一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。
  3. 总结 Person.prototype.constructor指向Person(函数)。而通过这个构造函数,我们还可继续为原型对象添加其他属性和方法。

    获取对象原型的方法

    Object.getPrototypeOf( )
    1. alert(Object.getPrototypeOf(person1) == Person.prototype);//true
    2. alert(Object.getPrototypeOf(person1).name) //"Nicholas"

    4.实例和构造函数的关系

    创建了自定义的构造函数之后,其原型对象默认只会取得constructor属性;至于其他方法,则都是从object继承而来。
    当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。(这个连接存在于实例与构造函数的原型对象之间,而不是存在于实例和构造函数之间。)
    ECMA-262第5版中管这个指针叫[[Prototype]]。虽然在脚本中没有标准的方式访问[[Prototype]], 但Firefox, Safari 和Chrome在每个对象上都支持一个属性proto; 而在其他实现中,这个属性对脚本则是完全不可见的。