成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS 面向?qū)ο?一)封裝(抽象)

codercao / 758人閱讀

摘要:面向?qū)ο蟮娜筇攸c(diǎn)封裝,繼承,多態(tài)缺一不可。構(gòu)造函數(shù),是一種特殊的方法。特別的一個(gè)類可以有多個(gè)構(gòu)造函數(shù),可根據(jù)其參數(shù)個(gè)數(shù)的不同或參數(shù)類型的不同來區(qū)分它們即構(gòu)造函數(shù)的重載。

一、基本概念和背景

面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP:Object-oriented programming)是一種程序設(shè)計(jì)范型,同時(shí)也是一種程序開發(fā)的方法。對(duì)象指的是類的實(shí)例。
面向?qū)ο?/strong>(Object Oriented,OO)是一種對(duì)現(xiàn)實(shí)世界理解和抽象的方法,是計(jì)算機(jī)編程技術(shù)[1] 發(fā)展到一定階段后的產(chǎn)物。

面向?qū)ο蟮娜筇攸c(diǎn)(封裝,繼承,多態(tài))缺一不可。通常“基于對(duì)象”是使用對(duì)象,但是無法利用現(xiàn)有的對(duì)象模板產(chǎn)生新的對(duì)象類型,繼而產(chǎn)生新的對(duì)象,也就是說“基于對(duì)象”沒有繼承的特點(diǎn)。而“多態(tài)”表示為運(yùn)行時(shí)類型確定(父類類型的子類對(duì)象實(shí)例),動(dòng)態(tài)綁定執(zhí)行對(duì)象,沒有了繼承的概念也就無從談?wù)摗岸鄳B(tài)”。
示例:繪制一個(gè)圖形,圖形已有為三角形、圓;
Java 示例

// 父類:抽象、封裝
public class  Graph {
 void draw() {
  System.out.println("draw a Graph");
 }
}
// 繼承:子類type1
public class Triangle extends Graph {
 @Override
 void draw() {
  System.out.println("draw a Triangle");
 }
}
 
// 繼承:子類type2
public class Circle extends Graph {
 @Override
 void draw() {
  System.out.println("draw a Circle");
 }
}
// 多態(tài):運(yùn)行時(shí)類型確定
public class Drawer {
 static void draw(Graph a) {
  a.draw();
}

// 運(yùn)行調(diào)用
public static void main(String args[]) {
  Graph p = new Triangle();
  Drawer.draw(p); // "draw a Triangle"
  p = new Circle();
  Drawer.draw(p); //"draw a Circle"
}

Javascript ES5示例

// 封裝
function Graph(){}
Graph.prototype.draw = function (){
  console.log("draw a Graph");
}
// 原型鏈引用
function Trianggle(){}
Trianggle.prototype = new Graph();
Trianggle.prototype.draw =  function (){
  console.log("draw a Trianggle");
}
// 原型鏈引用
function Circle(){}
Circle.prototype = new Graph();
Circle.prototype.draw =  function (){
  console.log("draw a Circle");
}
// 相對(duì)多態(tài):無顯示對(duì)象類型
function Drawer(obj){
  obj.draw();
}
// 運(yùn)行時(shí)類型確定
var p = new Trianggle();
Drawer(p);
p = new Circle();
Drawer(p); 

大多面向?qū)ο笳Z言中,面向?qū)ο笠话慊诿嫦颉悺脑O(shè)計(jì)。類是代碼抽象的模式之一:實(shí)例化(instantiation)、繼承(inheritance)、和 (相對(duì))多態(tài)(polymorphism)。類和實(shí)例的關(guān)系好比房屋建造。建筑師會(huì)繪制建筑藍(lán)圖,建筑工人根據(jù)藍(lán)圖落地成實(shí)際建筑,建筑就是藍(lán)圖的復(fù)制(概念和物理上的復(fù)制)。類就是建筑的抽象,含有一個(gè)建筑的所有特性。實(shí)例就是實(shí)際的建筑,包含了門、窗以及實(shí)際材料、地理位置。類通過復(fù)制操作被實(shí)例化為對(duì)象形式,實(shí)例間無直接關(guān)系。但這無法直接對(duì)應(yīng)到 JavaScript 的實(shí)現(xiàn)機(jī)制,因?yàn)?Javascript 沒有實(shí)質(zhì)類的概念,ES6的 class也是一種語法糖1。

二、JavaScript 封裝方法

面向?qū)ο缶幊虖?qiáng)調(diào)的是數(shù)據(jù)和操作數(shù)據(jù)行為的的相互關(guān)聯(lián),因此最好的設(shè)計(jì)就是把數(shù)據(jù)和它相關(guān)的行為打包(封裝)起來。
封裝(Encapsulation)是指一種將抽象性函數(shù)式接口的實(shí)現(xiàn)細(xì)節(jié)部份包裝、隱藏起來的方法。

2.1 好處

(1) 良好的封裝能降低耦合度
(2) 方面數(shù)據(jù)統(tǒng)一管理、對(duì)象內(nèi)部結(jié)構(gòu)靈活修改
(3) 對(duì)其成員有更精確的控制,易于擴(kuò)展
(4) 隱藏實(shí)現(xiàn)信息、細(xì)節(jié),只暴露需要的 API

2.2 封裝模式(創(chuàng)建對(duì)象模式) 構(gòu)造函數(shù)2 & 原型鏈

(1)工廠模式 - 函數(shù) 【內(nèi)部對(duì)象創(chuàng)建屬性方法并返回對(duì)象,使用this】

 function createPerson(name, age, job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function(){
            alert(this.name);
        }
        return o;
 }
var person1 = createPerson(“John”, 18, “Teacher");
var person2 = createPerson(“Greg”, 30, “Doctor”);

(2) 構(gòu)造函數(shù)模式【內(nèi)部 this創(chuàng)建屬性、方法;無 return; 通過改變 this指向創(chuàng)建實(shí)例】

**原生構(gòu)造函數(shù)**:隱式創(chuàng)建對(duì)象,屬性、方法賦值給 this對(duì)象,無 return;
function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1 = new Person(“John”, 18, “Teacher");
var person2 = new Person(“Greg”, 30, “Doctor”);

構(gòu)造函數(shù): new 顯示創(chuàng)建 對(duì)象

步驟1: 創(chuàng)建一個(gè)新對(duì)象
步驟2:講構(gòu)造函數(shù)的作用是賦值給新對(duì)象 (this 只向新對(duì)象 詞法作用域發(fā)生改變)
步驟3:執(zhí)行構(gòu)造函數(shù)的代碼 (為新對(duì)象 添加屬性 )
步驟4:返回新對(duì)象

function Person(name, age, job){
   this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}

構(gòu)造函數(shù)作為函數(shù); 問題:作用域改變,每個(gè)傳入的對(duì)象重建一遍;)
var person1 = new Object();

 Person.call( person1, “John”, 18, “Teacher");

var person2 = new Person(“Greg”, 30, “Doctor”);

(3) 原型模式 【原型對(duì)象創(chuàng)建屬性、方法】

   構(gòu)造函數(shù)無傳參, 共享原型對(duì)象的屬性,其中一個(gè)實(shí)例對(duì)原型對(duì)象的引用類型屬性做修改,影響所有其他實(shí)例對(duì)該屬性的使用;
 (* 引用類型屬性受影響  內(nèi)存分配機(jī)制不同引起)
function Person(){}

Person.prototype.name =  "Nicholas";
Person.prototype.age = 27;
Person.prototype.job = "Doctor";
Person.prototype.friends =  ["Lily", "John", "Alex"]
Person.prototype.sayName = function() {
     console.log(this.name);
}
Person.prototype.getFriends = function() {
     console.log(this.friends);
}
 var person1 = new Person();
 person1.name = "person1";

 var person2 = new Person();
 person2.name = "person2";
 person2.sayName();  //“person2"
 person2.getFriends(); // ["Lily", "John", "Alex"]
 person1.friends.push(“Van");
 person1.sayName(); //“person1"
 person2.getFriends();  //["Lily", "John", "Alex", "Van"]

(4) 構(gòu)造函數(shù) & 原型模式結(jié)合 【構(gòu)造函數(shù)獨(dú)立屬性方法,原型對(duì)象創(chuàng)建公用屬性、方法】
好處:構(gòu)造函數(shù)模式 定義實(shí)例個(gè)性化屬性;原型模式定義方法和共享屬性;功能模塊化 職責(zé)單一

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = [‘Lily", "John", "Alex"];
}

Person.prototype ={
    constructor: Person,
      sayName: function(){
         alert(this.name);
     }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
person1.friends.push("Van");
var person2 = new Person(“Greg", 27, "Doctor");

(5) 動(dòng)態(tài)原型模式 (使用:功能模塊化)【構(gòu)造函數(shù)獨(dú)立屬性方法,原型對(duì)象按需創(chuàng)建公用屬性、方法】

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = [‘Lily’, "John", "Alex"];
    
    if(typeof this.sayName != ‘function’){
            Person.prototype.sayName = function(){
                    alert(this.name);
            };
    }
}

(6) 寄生構(gòu)造函數(shù)模式 -【 已有對(duì)象擴(kuò)展 - 原型鏈 】 (使用:第三方庫擴(kuò)展 )

   1.寫法上和工廠模式一樣 調(diào)用時(shí)多加 new  
   2.此模式創(chuàng)建的對(duì)象 與構(gòu)造函數(shù)無關(guān)系, instanceof操作符無意義
function  Person(name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        alert(this.name);
    }
    return o;
}
 // 工廠模式
// var person1 =  Person(“John”, 18, “Teacher”);
// 寄生模式
 var friend  =  new Person(“John”, 18, “Teacher”); // 返回新對(duì)象的實(shí)例

(7) 穩(wěn)妥模式 【 內(nèi)部建對(duì)象不用 this 閉包 - 詞法作用域 】(穩(wěn)妥對(duì)象-無公共屬性,方法不引用 this)(使用:適用于安全環(huán)境 - 禁用 this 和 new)

 1.寫法上和寄生模式類似 , 除方法不使用 this  
 2.此模式創(chuàng)建的對(duì)象 與構(gòu)造函數(shù)無關(guān)系, instanceof操作符無意義
function  Person(name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        alert(name); //無 this
    }
    return o;
}
var friend = Person(“John”, 18, “Teacher”); //無 new
  • 類實(shí)質(zhì)是對(duì)象復(fù)制的概念,JavaScript 則是一種對(duì)象委托引用的概念,對(duì)引用類型變量變更其[prototype]依然擁有共享功能。 ?

  • 構(gòu)造函數(shù) ,是一種特殊的方法。主要用來在創(chuàng)建對(duì)象時(shí)初始化對(duì)象, 即為對(duì)象成員變量賦初始值,總與new運(yùn)算符一起使用在創(chuàng)建對(duì)象的語句中。特別的一個(gè)類可以有多個(gè)構(gòu)造函數(shù) ,可根據(jù)其參數(shù)個(gè)數(shù)的不同或參數(shù)類型的不同來區(qū)分它們 即構(gòu)造函數(shù)的重載。 ?

  • 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89537.html

    相關(guān)文章

    • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

      摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

      李昌杰 評(píng)論0 收藏0
    • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

      摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

      Lyux 評(píng)論0 收藏0
    • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

      摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

      AaronYuan 評(píng)論0 收藏0
    • JS中的面向對(duì)象編程

      摘要:一面向?qū)ο缶幊堂嫦驅(qū)ο缶幊淌且环N抽象方式創(chuàng)建模型的編程方式。繼承我們實(shí)現(xiàn)一個(gè)子類,繼承汽車類將類的屬性和方法賦值給繼承汽車類的原型鏈創(chuàng)建子類實(shí)例以上是中的面向?qū)ο缶幊痰暮?jiǎn)單介紹,如有錯(cuò)誤,歡迎指出。 一.面向?qū)ο缶幊堂嫦驅(qū)ο缶幊?OOP--Object Oriented Programming)是一種抽象方式創(chuàng)建模型的編程方式。繼承,封裝,多態(tài)是OOP的三大基本特征。許多主流編程語言都...

      lunaticf 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <