JS中类的实例方法,静态方法以及私有方法分析

JavaScript014

JS中类的实例方法,静态方法以及私有方法分析,第1张

现在有如下一个Person类:

类中定义了基本属性name 和age

```

  function Person( name, age){

        this.name = name||"lorentz"

        this.age  = age||27

    }

```

首先我们给它添加一个实例方法,即通过实例化该类,在类的实例上可以调用的方法

```

function Person( name, age){

        this.name = name||"lorentz"

        this.age  = age||27

    }

      //定义在原型上的方法 可以在实例上直接调用

    Person.prototype.sayAge = function(){

        console.log(`my age is ${this.age}`)

    }

    let p1 = new Person()

    p1.sayAge()  //my age is 27

```

通过构造函数的原型,定义了一个sayAg方法,所有的实例都可以通过原型链调用该方法。

静态方法即不需要实例化,可以直接利用构造函数调用的方法。在JS中,函数也是一个对象。将构造函数对象的某个属性设置为一个函数即为静态方法:

注意静态方法里this指向构造函数对象Person,而不是构造函数的实例

```

   function Person( name, age){

        this.name = name||"lorentz"

        this.age  = age||27

    }

      //定义在原型上的方法 可以在实例上直接调用

    Person.prototype.sayAge = function(){

        console.log(`my age is ${this.age}`)

    }

    Person.staticMethod = function(){

        console.log(`i am a static method `) //i am a static method 

        //静态方法中的this指向Person这个构造函数对象,在该对象里是没有age这个属性的

        console.log(`my age is ${this.age}`) // my age is undefined

        console.log(this)  //[Function: Person] { staticMethod: [Function (anonymous)] }

    }

    Person.staticMethod()   

```

在构造函数里定义私有方法,该方法无法在外部直接访问,通过闭包可以访问该方法

注意此时Person是一个普通函数,返回了一个对象,通过返回的对象可以访问他的私有方法

```

 function Person( name, age){

        this.name = name||"lorentz"

        this.age  = age||27

        let privateMethod = function(){

            console.log(`i am a priviate method`)

        }

        return {

            fn: privateMethod

        }

    }

    let p = Person()

    p.fn()  //i am a priviate method

```

百度到的很多内容都是类似这样的:

然后就很少有然后了,今天突然看到静态方法与实例方法这个词之后,于是有了这篇文章,让我们看看还有什么其他不同。

上边提到静态方法是直接通过属性添加的方法,实例方法是添加给实例化对象的方法。

不难看出,静态方法中的this指向的是构造函数本身,而实例方法中的this指向的是实例化对象。

这里要表达的是实例方法不能通过构造函数直接调用,而静态方法也不能通过实例调用。定义在构造函数内部的形式也是实例方法,表现与原型链添加的方式一致,但并不推荐这种写法。

此外如果是通过原型链进行的继承,那么也不会继承静态方法

有说法静态方法和实例方法对内存的分配也不同,如果实例方法是通过原型链添加的话,我觉得没啥不同(手动狗头)。还望指教。

①首先需要在内存中创建一个空对象,{}这种语法被称为字面量表示法,通过这种语法,浏览器在内存中创建一个对象。

②然后将等价于new关键字(在功能上等价)的函数ObjectFactory第一个参数作为实例对象的构造函数,简历索引关系。

③通过__proto__建立实例对象与原型对象的联系。

④将构造函数的属性方法创建一份副本并挂载到实例对象上,最后返回实例化完成的对象。