写出几种建立对象的体式格局,并说说他们的区分是什么?

new Object()

直接经由过程组织函数建立一个新对象。

var obj = new Object()
//等同于 var obj = {}

运用字面量的体式格局更简朴,实在他俩是一样的。
长处是充足简朴,瑕玷是每一个对象都是自力的。

工场形式

function createObj(name,age){
    var obj = {};
    obj.name=name;
    obj.age=age;
    return obj
}
var Anson = createObj('Anson', 18)
console.log(Anson)
//{name: "Anson", age: 18}

长处是 能够处理建立多个类似对象的题目,瑕玷是 没法辨认对象的范例。

组织函数

function Person(name,age){
    this.name =name;
    this.age=age;
    this.sayName =function (){ alert(this.name) }
}
var person = new Person('小明',13);
console.log(person);
//Person {name: "小明", age: 13, sayName: ƒ}

长处是 能够建立特定范例的对象,瑕玷是 多个实例反复建立要领

(组织函数+原型)组合形式

function Person(name, age){
    this.name = name;
    this.age = age;
    Person.prototype.sayName = function (){ alert(this.name) }
 }
var person = new Person('小白',18)
console.log(person);
//Person {name: "小白", age: 18} __proto__ -> sayName: ƒ ()

长处 多个实例援用一个原型上的要领 比较经常使用

动态原型

function Person(name,age){
    this.name=name
    this.age =age
    if(typeof this.sayName != 'function'){
        Person.prototype.sayName = function(){ alert(this.name) }
  }
}
var person = new Person('小红',15)
console.log(person);
//Person {name: "小红", age: 15} 动态建立sayName: ƒ ()

长处 能够推断某个要领是不是有用,来决议是不是须要初始化原型,if只会在仅在遇到第一个实例挪用要领
时会实行,今后一切实例同享此要领,须要注重的一点是,不能从新原型对象。

寄生组织函数形式

function Person(name,age,job){
    var o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function(){
        console.log(this.name)
    }
    return o;
}
var friend=new Person("her",18,"Front-end Engineer");
friend.sayName();
//her

除了运用new操作符,其他的和工场函数一样,能够为对象建立组织函数。

稳妥形式

function Person(name, age){
    var o={};
    o.sayName=function(){ alert(name) }
    return o;
}
var person = ('小亮',24);
person.sayName();//’小亮‘

除了运用person.sayName()以外 ,没有办法在访问到name的值,适合在某些平安实行环景下运用。

Object.create()

const person = {
  isHuman: false,
  printIntroduction: function () {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  }
};

const me = Object.create(person);

me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten

me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"

传入一个原型对象,建立一个新对象,运用现有的对象来供应新建立的对象的__proto__,完成继续。

参考:《JavaScript高等程序设计第三版》、MDN

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