JavaScript类的写法

js类的基础寄义

我们晓得,在js中,是没有类的观点的。类的一切实例对象都从同一个原型对象上继续属性,因而,原型对象是类的中心。

类是对象的笼统,而对象是类的详细实例。类是笼统的,不占用内存,而对象是详细的,占用存储空间。———百度百科

初期的javascript需求都很简朴,基础都是写成函数的,然后是面向历程的写法,厥后逐步的引入面向对象开辟头脑,再厥后就逐步写成

js中,写成类的实质基础都是 组织函数+原型。下面,就讨论一下js类的几种写法:

组织函数 法

/**
* Person类:定义一个人,有name属性和getName要领
   */
<script>
    function Person(name){
        this.name = name;
        this.getName = function(){
            return this.name;
        }
    }

    //我们在这里实例化几个对象
   
    var p1 = new Person("trigkit4");
    var p2 = new Person("mike");

    console.log(p1 instanceof Person);//true
    console.log(p2 instanceof Person);//true
</script>

由上面控制台输出效果可知,p1和p2的确是类Person的实例对象。instanceof操作符左侧是待检测类的对象,右侧是定义类的组织函数。这里,instanceof用来检测对象p1是不是属于Person类。

这类体式格局的长处是:我们能够依据参数来组织差别的对象实例 ,瑕玷是每次组织实例对象时都邑天生getName要领,形成了内存的糟蹋 。

我们能够用一个外部函数来替代类要领,达到了每一个对象同享同一个要领。改写后的类以下:

//外部函数
<script>
    function getName() {
        return this.name;
    }

    function Person(name){
        this.name = name;
        this.getName = getName;//
    }
</script>

原型体式格局

<script>
    function Person(){};
    Person.prototype.name = "trigkit4";//类的属性都放在prototype上
    Person.prototype.getName = function(){
        return " I'm " + this.name;
    }

    var p1 = new Person();
    var p2 = new Person();
    console.log(p1.name);//trigkit4
    console.log(p2.getName());//I'm trigkit4
</script>

原型体式格局的瑕玷就是不能通过参数来组织对象实例 (平常每一个对象的属性是不相同的) ,长处是一切对象实例都同享getName要领(相对于组织函数体式格局),没有形成内存糟蹋 。

组织函数+原型体式格局

取前面两种的长处:
a、用组织函数来定义类属性(字段)。
b、用原型体式格局来定义类的要领。

<script>
    function Person(name){
        this.name = name;
    }

    //原型的特征能够让对象实例同享getName要领
    Person.prototype.getName = function(){
        return " I'm " + this.name;
    }
</script>

如许,我们就既能够组织差别属性的对象,也能够让对象实例同享要领,不会形成内存的糟蹋。

为了让js代码作风更紧凑,我们让prototype要领代码移到function Person的大括号内。

<script>
    function Person(name){
        this.name = name;
        Person.prototype.getName = function(){
            return name;//不宜用this.name
        }
    }

    var p1 = new Person('trigkit4');
    console.log(p1.getName());//trigkit4
</script>

在这里,我们须要晓得的几种定义类的要领,除了上面的组织函数外,另有:

Object.create()要领

用这个要领,"类"就是一个对象,而不是函数。

 var Person = {
        name : "trigkit4",
        age : 21,
        run:  function(){
            alert("I like running");
        }
    }

然后,直接用Object.create()天生实例,不须要用到new。

var p1 = Object.create(Person);
    alert(p1.age);//21
    p1.run();//I like running

这类要领比”组织函数法“简朴,然则不能实现私有属性和私有要领,实例对象之间也不能同享数据,对”类”的模仿不够周全。

createNew()要领

这类要领不须要用到this和prototype,其做法是用对象来模仿一个类,然后在类内里定义一个组织函数createNew(),然后在createNew()内里定义实例对象,把这个实例对象作为返回值。

<script>
    var Person = {

        createNew : function () {
            var person = {};
            person.name = "trigkit4";
            person.run = function(){
                alert("I like running");
            };
            return person;
        }

    }
</script>

运用的时刻,挪用createNew()要领,就能够获得实例对象。

 var p1 = Person.createNew();
    p1.run();//I like running

这类写法实在和对象字面量的写法是很相似的,只不过一个是逗号分开,一个是分号分开。

    原文作者:trigkit4
    原文地址: https://segmentfault.com/a/1190000000725051
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞