JavaScript(十三)面向對象

  面向對象windows

面向對象的過程閉包

  經過new 構造函數 生成的對象來執行, 相似於事件的執行  this指向函數,而後再把這個函數賦值給一個實例  因此在函數內的this  就指到了實例上app

function Person (age,lastname,) {
      this.age = age
      this.lastname = lastname;
    }
 var xiaoming = new Person(12,'小明');
 console.log(xiaoming);

 

構造函數的首字母要大寫   你們默認的規範dom

對象中若  value 非函數  叫作屬性   若 是函數  叫方法函數

this的指向性能

  普通對象,計時器,定時器,this 質量window this

  對象中的方法的this  指向這個對象,這個對象就和windows相似spa

  綁定事件時 this指向 dom對象prototype

  閉包的this 指向上次運行的函數環境rest

  自執行函數  指向window

  對象中的定時器等的this還是指向window 因此須要在對象內備份 this 

實例與構造函數的關係

  新生成的對象  有個屬性 constructor      就是這個對象的構造函數

  實例  instanceof 構造函數  ---->true

console.log(xiaoming.constructor);
console.log(xiaoming instanceof Person);

 

面向對象中的類的概念

  就是 構造函數  ,同一個構造函數  new出來的 就屬於一個類

原型

  構造函數方法存在必定的弊端,對於對象中一成不變的屬性 並不須要每次都new ,這樣很浪費性能,那麼  就把這用一成不變的存儲到   構造函數的原型上面

    function Person (age,name,) {
      this.age = age;
      this.name = name;
    }
    Person.prototype.sex = 'male';

    var xiaoming = new Person(12,'xiaoming');
    console.log(xiaoming.sex);//這個性別就是從原型上繼承的

  構造函數的原型除了以    fun.prototype.attr = ***; 的格式 

 

  還能夠   寫整個 原型    

Person.prototype = {
    age : 12,
    sex:'male',
    constructor : Person //這裏若是不寫 new的實例調用constrotur 不會返回person 而返回 Object
}

 

 

prototype和__proto__

 prototype       全部的函數都有原型prototype   

 .__proto__    全部的對象都有原型對象   ∵全部的對象都是用構造函數建立的

constructor,protype與__proto__

 

判斷這個實例是否是這個構造函數new的

  構造函數的原型 .isProtypeOf(新對象)

  

利用 in 結合 hasOwnProperty判斷是否是從原型繼承來的屬性

for (var pro in xiaoming) {
  if(xiaoming.hasOwnProperty(pro)){
        console.log(pro + '是本地屬性')
    }  
}

 綁定構造函數    兩個對象(構造函數之間)繼承

  1.call / apply 用父類     代替子類的this  

    父構造函數.call(this,[arguments])  

 function Foo () {
     this.lastName = 'wang';
   }

  function Son (height) {
    Foo.call(this);  //就這一步就能夠繼承來 Foo的屬性
    this.height = height;
  }

  var xw = new Son(180);
  console.log(xw.lastName);  //wang

 

 

prototype的繼承方法

  寫在perotype 上的屬性在生成實例的時候不會被 調用   因此 實例上的屬性由繼承來的更好   提取公共部分在原型上

    function Foo() {
      this.firestName = '老王';
    }
    Foo.prototype.lastName = 'wang';

    function Son() {
      this.firstName = '小王';
    }

    Son.prototype = new Foo();
    Son.prototype.constrotur = Son;

    var xw = new Son();
    console.log(xw.firstName);
    console.log(xw.lastName);
    console.log(xw.constrotur);

 利用空的函數的prototype 實現繼承

function extend(parent, child) {
var F = function(){};
F.prototype = parent.prototype;
child.prototype = new F();
child.prototype.constructor = child;
child.uber = parent.prototype;
}

拷貝繼承 就是把parent.protype 上的屬性 遍歷拷貝到 child 的protype上

 

 

function copy(parent, child) {
      var p = parent.prototype;
      var c = child.prototype;
      for (var pro in p) {
        c[pro] = p[pro]; //這裏的pro是屬性名!!!!是字符串形式的  因此只能用[]的形式
      }
      c.uber = p;
    }
相關文章
相關標籤/搜索