时间: 2020-09-1|tag:64次围观|0 条评论

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 overwrittenme.printIntroduction();// expected output: "My name is Matthew. Am I human? true"

传入一个原型对象,创建一个新对象,使用现有的对象来提供新创建的对象的proto,实现继承。

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

文章转载于:https://www.jianshu.com/p/abcb71c2776c

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《写出几种创建对象的方式,并说说他们的区别是什么?
   

还没有人抢沙发呢~