js 面向对象类

Posted 坚持不懈?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 面向对象类相关的知识,希望对你有一定的参考价值。

  • 类的声明
  • 继承的几种方法

 

类的声明

第一种

function car(){
    this.name = \'name\';  
}

第二种。es6中新添加的

class car(){
      constructor(){
            this.name =\'name\';
    }
}    

继承的几种方法

1.构造函数实现继承

function Parent(){
    this.name = \'parent\';
}
Parent.prototype.toSay = function(){
    console.log(this.name);  
}

function Child(){
    Parent.call(this);
    this.name1 = \'child\';
}

console.log(new Child())

原理:在子类中调用了父级的构造函数,并把上下文换成子类,只是部分继承

缺点:看到上面输出的就知道,父类的prototype上的方法继承不了

2、原型链继承

上面的方法父类的prototype的方法继承不了,就自然会想到把父类实例赋值给子类的prototype这样,因为Parent的实例的__proto__指向了Parent.prototype

function Parent(){
    this.name=\'parent\';
   this.play = [1, 2, 3]; } function Child(){ this.type="child"; } Child.prototype = new Parent(); var c1 = new Child(); var c2= new Child();

  c2.play.push(4);
  console.log(c1.play, c2.play);

缺点:会改变原型链上的数值 

优化组合方法一

function Parent(){
    this.name= \'name\';
    this.play = [1, 2, 3];
}

function Child(){
    Parent.call(this);
    this.type = \'child\'
}

Child.prototype = new Parent()
var c1= new Child();
var c2 = new Child();
c2.play.push(4);
console.log(c1.play, c2.play);

原理:这是上面两种方法的组合

缺点:父级的构造函数在子类实例的时候执行了两次

优化组合方法二

 function Parent () {
          this.name = \'parent\';
          this.play = [1, 2, 3];
      }
      function Child () {
          Parent.call(this);
          this.type = \'child\';
      }
      Child.prototype = Parent.prototype;
      var c1 = new Child();
      var c2 = new Child();

      console.log(c1 instanceof Child, c2 instanceof Parent);
      console.log(c1.constructor);

原理:和上面的一种比较是不再实例Parent而是直接将Child.prototype指向Parent.prototype,这样parent原型链上有的方法,child也会有

缺点:子类的构造器是父类,而不是子类,因为他们共用了一个原型对象

完美的方法

function Parent(){
    this.name = \'parent\';
    this.play=[1,2]
}

function Child(){
    Parent.call(this)
    this.type = \'child\'
}

Child.prototype = Object.create(Parent.prototype)
Child.constructor = Child;

 

以上是关于js 面向对象类的主要内容,如果未能解决你的问题,请参考以下文章

JS面向对象组织代码

JS面向对象 关于类的封装继承多态

关于JS的面向对象总结

js 面向对象代码

node.js 是面向对象的么

1102面向对象和类原型