亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

js構(gòu)造函數(shù)

vpants / 1299人閱讀

摘要:今年歲了調(diào)用私有方法實(shí)例化張三此時(shí)實(shí)例獲取不到方法追更感謝之染的評(píng)論,構(gòu)造函數(shù)還可以通過來添加對(duì)象栗子實(shí)例化張三此時(shí)實(shí)例化后的對(duì)象擁有方法輸出張三關(guān)于構(gòu)造函數(shù)的繼承可以看一下我的下一篇文章構(gòu)造函數(shù)繼承方法及利弊

js構(gòu)造函數(shù)

前言:之前看過公司大神的代碼,發(fā)現(xiàn)有很多構(gòu)造函數(shù),類似Java和C#的 new 方法來實(shí)例化一個(gè)對(duì)象,感覺很是受教,剛好最近在用es6,發(fā)現(xiàn)了用class來實(shí)現(xiàn)構(gòu)造函數(shù),于是總結(jié)了一下,也是回顧和提高的過程,由于本人也是前端小白,文章可能有很多錯(cuò)誤,歡迎各位大神批評(píng)指正~~

傳統(tǒng)ES5語法
    // 常規(guī)方法一
    function Persion(name, age) {
        this.name = name;                // this.key 賦值,則直接掛載到Persion實(shí)例
        this.age = age;
        this.getInfo = function() {
            return {
                name: this.name,
                age: this.age
            }
        }
    }
    // 調(diào)用
    var persion = new Persion("張三", 15);
    // 此時(shí)的persion實(shí)例擁有name、age、getInfo()三個(gè)屬性及方法

    // 常規(guī)方法二
    function Persion(name, age) {
        var name = name;
        var age = age;
        var getInfo = function() {
            return {
                name: name,
                age: age,
            }
        }
        return { // 通過return將元素暴露給實(shí)例對(duì)象
            name: name,
            age: age,
            getInfo: getInfo,
        }
    }
    // 調(diào)用 
    var persion = new Persion("張三", 15);
    // 此時(shí)的persion實(shí)例擁有name、age、getInfo()三個(gè)屬性及方法
ES6
class Persion {
    constructor(name, age) { // 一個(gè)類必須有constructor方法, 如果沒有顯式定義, 一個(gè)空的constructor方法會(huì)被默認(rèn)添加。
        this.name = name;
        this.age = age;
    }
    getInfo() {
        return {
            name: this.name,
            age: this.age,
        }
    }
}
// 調(diào)用
const persion = new Persion("張三", 17);
// 此時(shí)的persion實(shí)例擁有name、age、getInfo()三個(gè)屬性及方法

注:ES6 class 聲明構(gòu)造函數(shù)會(huì)將所有內(nèi)部元素暴露出來,但有的時(shí)候我們希望這些方法只在內(nèi)部聲明時(shí)使用,并不暴露給實(shí)例對(duì)象,在ES5中我們可以很方便的做到,如下栗子:

    // ES5 實(shí)現(xiàn)私有方法
    // 方案一
    function Persion(name, age) {
        this.name = name;
        this.age = age;
        var print = function(){
            return name + "今年" + age + "歲了!";
        }
        this.setName = function(newName){
            this.name = newName;
        }
        this.setAge = function(newAge){
            this.age = newAge;
        }
        this.getInfo = function(){
            {
                name: name,
                age: age,
            }
        }
        this.printInfo = function(){
            console.log(print());
        }
    }
    // 實(shí)例化
    var persion = newPersion("張三", 15);
    
    // 方案二
    function Persion(name, age) {
        var name = name,
            age = age;
        // print作為私有方法,只在內(nèi)部用于生成輸出字符串,并不需要暴露到外部
        var print = function(){
            return name + "今年" + age + "歲了!";
        }
        var setName = function(newName){
            name = newName;
        }
        var setAge = function(newAge){
            age = newAge;
        }
        var getInfo = function(){
            {
                name: name,
                age: age,
            }
        }
        var printInfo = function(){
            console.log(print());
        }
        return {
            name: name,
            age: age,
            setName: setName,
            setAge: setAge,
            getInfo: getInfo,
            printInfo: printInfo,
        }
    }
    // 實(shí)例化
    var persion = newPersion("張三", 15);
    // 此時(shí)實(shí)例化的persion 將不會(huì)暴露出print方法,我個(gè)人更傾向于方案二的方法,可以清楚的看出哪些屬性和方法需要暴露出來,也容易修改需要暴露的接口。

那么在ES6中我們要怎么實(shí)現(xiàn)私有的方法和屬性呢?其實(shí)方法很多,但都很不友好,我只總結(jié)了三種,如果有什么好的方法歡迎大家給我留言,不勝感激:)

// 私有方法 變通方案
// 方案一 (其實(shí)并不算一個(gè)方法。。。)
class Persion {
    constructor(name, age) { 
        this.name = name;
        this.age = age;
    }
    _print() { // 通常以“_”開頭命名的方法為內(nèi)部私有方法
        return name + "今年" + age + "歲了!";
    }
    setName(newName) {
        this.name = newName;
    }
    setName(newAge) {
        this.age= newAge;
    }
    printInfo() {
        console.log(_print());
    }
    getInfo() {
        return {
            name: this.name,
            name: this.age,
        }
    }
}
// 實(shí)例化
const persion = new Persion("張三", 15);
// 此時(shí)persion實(shí)例仍然能獲取到_print方法,只能用來區(qū)分私用和公有方法而已;

// 方案二
// 注意若使用ES6箭頭函數(shù)則this指向的是該方法本身,而非調(diào)用它的對(duì)象,
function _print() { // 外部聲明_print 方法,在內(nèi)部調(diào)用,此時(shí)_print 成為Persion類的私有方法
    return this.name + "今年" + this.age + "歲了!";
}
class Persion {
    constructor(name, age) { 
        this.name = name;
        this.age = age;
    }
    setName(newName) {
        this.name = newName;
    }
    setName(newAge) {
        this.age= newAge;
    }
    printInfo() {
        console.log(_print());
    }
    getInfo() {
        return {
            name: this.name,
            name: this.age,
        }
    }
}
// 實(shí)例化
const persion = new Persion("張三", 15);
// 此時(shí)persion實(shí)例獲取不到_print方法;
    
// 方案三
const print = Symbol("print"); // 聲明一個(gè)Symbol值,用來做為私有方法的名字
class Persion {
    constructor(name, age) { 
        this.name = name;
        this.age = age;
    }
    setName(newName) {
        this.name = newName;
    }
    setName(newAge) {
        this.age= newAge;
    }
    [bar]() {  // 將私有方法的名字命名為一個(gè)Symbol值。
        return this.name + "今年" + this.age + "歲了!";
    }
    printInfo() {
        console.log([bar]()); // 調(diào)用私有方法
    }
    getInfo() {
        return {
            name: this.name,
            name: this.age,
        }
    }
}
// 實(shí)例化
const persion = new Persion("張三", 15);
// 此時(shí)persion實(shí)例獲取不到[bar]方法;

# 追更
感謝 @黒之染 的評(píng)論, 構(gòu)造函數(shù)還可以通過prototype來添加對(duì)象

栗子:
```
function Persion(name, age){
    this.name = name,
    this.age = age,
}
Persion.prototype.getInfo = function(){
    return {
        name: this.name,
        age: this.name,
    }
}
// 實(shí)例化
var persion = new Persion("張三");
// 此時(shí)實(shí)例化后的對(duì)象persion擁有g(shù)etInfo()方法
persion.getInfo() // 輸出{name: "張三"}
```

關(guān)于js構(gòu)造函數(shù)的繼承可以看一下我的下一篇文章js構(gòu)造函數(shù)(繼承方法及利弊)

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

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

相關(guān)文章

  • JS基礎(chǔ)(對(duì)象創(chuàng)建,構(gòu)造函數(shù)、原型、實(shí)例之間關(guān)系,繼承方式)

    摘要:對(duì)象創(chuàng)建的三種方式字面量創(chuàng)建方式系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式自定義構(gòu)造函數(shù)構(gòu)造函數(shù)原型實(shí)例之間的關(guān)系實(shí)例是由構(gòu)造函數(shù)實(shí)例化創(chuàng)建的,每個(gè)函數(shù)在被創(chuàng)建的時(shí)候,都會(huì)默認(rèn)有一個(gè)對(duì)象。 JS 對(duì)象創(chuàng)建的三種方式 //字面量創(chuàng)建方式 var person= { name:jack } //系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式 var person= new Object(); person.name = jack; ...

    PAMPANG 評(píng)論0 收藏0
  • JS 原型的解釋

    首先明確兩個(gè)概念: 構(gòu)造函數(shù)和 instance 分別是什么 構(gòu)造函數(shù)JS 中并沒有在語法層面上面區(qū)分構(gòu)造函數(shù)和普通函數(shù), 唯一的區(qū)別是調(diào)用方式使用 new 調(diào)用的函數(shù)就是構(gòu)造函數(shù), 沒有則是普通函數(shù). 實(shí)例new Constructor() 返回的對(duì)象稱為 Constructor 的一個(gè)實(shí)例 然后提出一個(gè)規(guī)則:在構(gòu)造函數(shù)的原型上面附加的屬性或者方法, 可以被其所有的實(shí)例共用. 可以推導(dǎo)出: ...

    silvertheo 評(píng)論0 收藏0
  • JS面向?qū)ο缶幊讨庋b

    摘要:在基于原型的面向?qū)ο蠓绞街?,?duì)象則是依靠構(gòu)造函數(shù)和原型構(gòu)造出來的。來看下面的例子優(yōu)點(diǎn)與單純使用構(gòu)造函數(shù)不一樣,原型對(duì)象中的方法不會(huì)在實(shí)例中重新創(chuàng)建一次,節(jié)約內(nèi)存。 我們所熟知的面向?qū)ο笳Z言如 C++、Java 都有類的的概念,類是實(shí)例的類型模板,比如Student表示學(xué)生這種類型,而不表示任何具體的某個(gè)學(xué)生,而實(shí)例就是根據(jù)這個(gè)類型創(chuàng)建的一個(gè)具體的對(duì)象,比如zhangsan、lisi,由...

    YFan 評(píng)論0 收藏0
  • JS高級(jí)程序設(shè)計(jì)》讀書筆記----JS創(chuàng)建對(duì)象的七種模式

    摘要:用對(duì)象字面量形式創(chuàng)建的對(duì)象,直接賦值給函數(shù)的原型對(duì)象,本質(zhì)上完全重寫了其對(duì)象,因此屬性也就變成了新對(duì)象的屬性指向構(gòu)造函數(shù),不再指向函數(shù)。 【上一篇】:JavaScript對(duì)象內(nèi)部屬性及其特性總結(jié) showImg(https://segmentfault.com/img/bVbjYsc?w=839&h=489); 工廠模式(★★) 先在內(nèi)部顯示地創(chuàng)建一個(gè)臨時(shí)對(duì)象,根據(jù)接收的參數(shù)來構(gòu)建(賦...

    Dogee 評(píng)論0 收藏0
  • JavaScript面向?qū)ο?/b>

    摘要:構(gòu)造函數(shù)的兩個(gè)特征函數(shù)內(nèi)部使用了,指向所要生成的對(duì)象實(shí)例。將一個(gè)空對(duì)象的指向構(gòu)造函數(shù)的屬性,這個(gè)對(duì)象就是要返回的實(shí)例對(duì)象。用面向?qū)ο箝_發(fā)時(shí),把要生成的實(shí)例對(duì)象的特有屬性放到構(gòu)造函數(shù)內(nèi),把共有的方法放到構(gòu)造函數(shù)的里面。 JS中面向?qū)ο蟮母拍?面向?qū)ο驩OP是一種組織代碼結(jié)構(gòu)、實(shí)現(xiàn)功能過程的思維方式。它將真實(shí)世界各種復(fù)雜的關(guān)系,抽象為一個(gè)個(gè)對(duì)象,然后由對(duì)象之間的分工與合作,完成對(duì)真實(shí)世界的...

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

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

0條評(píng)論

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