JS中建立对象的几种设想形式

工场形式

  • 定义:工场形式异常直观,将建立对象的历程笼统为一个函数,用函数封装以特定接口建立对象的细节。浅显地讲,工场形式就是将建立对象的语句放在一个函数里,经由过程传入参数来建立特定对象,末了返回建立的对象。
  • 缺点:工场形式虽然能够建立多个类似的对象,但却不能解决对象标识的题目,即如何晓得一个对象的范例(以下,我只晓得s1是Object–万物皆对象,但我并不晓得s1究竟是Student范例照样Person范例?就好像是一个孤儿一样,只能晓得他是个人,但不晓得他是哪家人。。。)
function createStudent(name,sex,grade){                                                         
    var o = new Object();
    o.name = name;
    o.sex = sex;
    o.grade = grade;

    o.sayName = function(){
        console.log(this.name);
    }
    return o;
}
var s1 = createStudent('Claiyre','famale',1);

组织函数形式

  • 定义:组织函数形式是java言语建立对象的通用体式格局。(但两种言语用组织函数建立对象的体式格局略有差别)
  • 在JavaScript中没有类的观点,函数即为一等国民,因而,没必要显式声明某个类,直接建立组织函数即可,类的要领和属性在组织函数中(或原型对象上)处置惩罚。
function Student(name,sex,grade){                                                   
    this.name = name;
    this.sex = sex;
    this.grade = grade;
    this.sayName = function(){
        console.log(this.name);
    }
}
var s2 = new Student('孙悟空','male',2);
  • 注重:组织函数的函数名首字母是大写的,而一般函数首字母则是小写,这是浩瀚OO言语约定俗成的划定,虽然大多数状况下不大写也不会报错,然则为了代码的规范性和可读性,照样应当将组织函数的首字母大写,与一般函数区别开。
  • 上风:与工场形式比拟,用组织形式建立对象有以下几点差别:

    • 没有显现地建立对象
    • 直接将属性和要领赋给this对象
    • 没有return语句
  • 缺点:每一个要领都要在每一个实例上建立一遍:在ECMAScript中,函数即对象,因而每定义一个函数,也就是实例化了一个对象。经由过程组织函数实例化的多个对象的要领,是多个差别的要领,但它们内部的代码以及完成的功用是雷同的,这就造成了肯定的资本糟蹋。

原型形式

  • 定义:js中,每一个函数都有一个prototype属性,它指向一个对象,叫做原型对象,原型对象包括了能够由特定范例的一切实例对象同享的属性和要领。另外,这个对象有一个与生自来的属性constructor,指向建立对象的组织要领。运用原型形式能够让一切的实例同享原型对象中的属性和要领,也就是说,没必要再组织函数中定义对象实例的信息。
function Student_1(){

}
Student_1.prototype.name = 'Claiyre';
Student_1.prototype.sex = 'female';
Student_1.prototype.class = 5;
Student_1.prototype.sayName = function (){
    console.log(this.name);
}

var s5 = new Student_1();                                                         
s5.sayName();    //Claiyre
var s6 = new Student_1();
s6.sayName();    //Claiyre
  • 引伸知识点:

    • Object.getPrototypeOf(object)要领返回参数对象的原型对象。
    • Object.keys(object)要领返回对象上罗列的实例属性。
  • 缺点:原型中的一切属性都是被一切实例所同享的,这类同享关于函数来讲异常适宜,关于包括基础值的属性也说的过去(实例属性会掩盖原型同名属性),但关于那些包括援用范例的属性,可有大麻烦了:
Student_1.prototype.friends = ['aa','bb'];

console.log('s6的朋侪' + s6.friends); // s6的朋侪aa,bb
s5.friends.push('cc');
console.log('s5的朋侪' + s5.friends); // s5的朋侪aa,bb,cc
console.log('s6的朋侪' + s6.friends); // s6的朋侪aa,bb,cc
// 我们只想转变s5的朋侪列表,但由于原型形式的同享实质,s6的朋侪列表也随之转变了

组合运用组织函数和原型形式

  • 定义:组织函数形式用于定义实例属性,原型形式则用于定义要领和同享的属性。这类夹杂形式不仅支撑向组织函数传入参数,还最大限制地勤俭了内存,可谓是集两形式之长。
 function Student(name,sex,grade){                                                   
    this.name = name;
    this.sex = sex;
    this.grade = grade;
}

Student.prototype.sayName = function(){
        console.log(this.name);
}
Student.prototype.school = 'Joooh school';

其他形式

除了以上几种罕见的形式外,批量建立对象的体式格局另有

  • 动态原型形式:仅在第一次挪用组织函数时,将要领赋给原型对象的响应属性,其他示例的处置惩罚体式格局同组织函数形式
  • 寄生组织函数形式:仅仅封装建立对象的代码,然后再返回新建立的对象,仍运用new操作符挪用
  • 稳妥组织函数形式:没有大众属性,只要私有变量和要领,以及一些get/set要领,用以处置惩罚私有变量
    原文作者:dugujiujian
    原文地址: https://segmentfault.com/a/1190000018350759
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞