js中创建对象的几种模式

什么是对象:
无序属性的集合,其属性可以包含基本值,对象或者函数把 ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数

接下里就说创建对象几种模式下的优缺点

1.工厂模式
显示创建对象
显示返回一个对象

缺点:无法判断对象类型

function factory(name, age, sex) {
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.sex = sex;
    return obj;
}
var obj1 = factory('yyqx', 18, 'nan');
console.log(obj1);

2.构造函数模式
不能显示创建对象
隐式新的对象
能判断对象类型

缺点:因私有而冗余 所有的方法和属性都会在实例上创建一遍

function Factory(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.eat = function(food) {
        console.log('我只会' + food)
    }
}

var str = new Factory('yyqx', 18, 'nan');
console.log(str);
str.eat('饭');

模拟构造函数创建对象

 var obj = {};
 Factory.call(obj, 'll', 18, 'girl');
 obj.__proto__ = Factory.prototype;

3.原型模式
将属性和方法都放在原型对象上
因为共享特性 导致原型上引用类型在各个实例上都会有影响
原型中所有属性是被实例共享的
对于包含引用类型值的属性来说 问题很大

function Hyj() {

}
console.log(Hyj.prototype);

Hyj.prototype.name = 'yyqx';
Hyj.prototype.age = '18';
Hyj.prototype.sex = 'nan';
Hyj.prototype.eat = function(food) {
    console.log('我侄子会' + food)
}

console.log(Hyj.prototype);
Hyj.prototype.eat('饭');

**4.构造+原型

私有属性
function Factory(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
}
共有属性
Factory.prototype.aet = function(food) {
    console.log('我知乎' + food)
}

var str = new Factory('yyqx', 18, 'nv');
console.log(str)
Factory.prototype.aet('fan');

希望我的理解可以给你们提供一些帮助,学识有限,如果有地方出现错误或者有更好的方法去实现,欢迎私信!

你可能感兴趣的:(js中创建对象的几种模式)