JavaScript对象的创建
原文
简书原文:https://www.jianshu.com/p/6cb1e7b7e379
大纲
前言
1、简单方式创建对象的方法
2、工厂模式创建对象
3、构造函数模式创建对象
4、原型模式创建对象
5、组合使用构造函数模式和原型模式
6、动态原型模式创建对象
7、寄生构造函数模式
8、稳妥构造函数模式
9、代码资源
前言
JavaScript是一门基于对象的语言。
JavaScript本身包含许多对象,这些对象称之为JavaScript的内建对象。
有些对象(如:person)在JavaScript语言里并不存在。我们可以利用JavaScript语言来创建自己的对象——术语称之为用户定义对象(user-defined object),也就是所谓的创建对象。
通过创建自定义对象,可以用来弥补很多内建对象无法做到的事情。
1、简单方式创建对象的方法
虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复代码。
//1.1、利用对象字面量的方式创建对象 var person = { name: 'kk', age: 12, job: 'IT', say: function () { console.log('hello' + this.name); } } console.log(person); //1.2、利用new Object的方式创建对象 var person = new Object(); person.name = 'kk'; person.age = 12, person.job = 'IT', person.say = function() { console.log('hello' + this.name); } console.log(person);
2、工厂模式创建对象
工厂模式创建对象的方法是基于基本创建对象的方法上的,是为了解决使用基本创建对象的方法产生大量重复代码的问题而产生的,工厂模式抽象了创建具体对象的过程,通过函数来封装以特定接口创建对象的细节。
function createPerson(name, age, job) { var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; obj.say = function () { console.log('hello' + this.name); } return obj; } var person = createPerson('kk', 12, 'IT'); console.log(person);
3、构造函数模式创建对象
构造函数在工厂模式创建对象的基础上弥补了工厂模式创建对象的没有识别对象类型的不足,通过构造函数来识别不同构造函数创建不同对象的类型。
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.say = function () { console.log('hello' + this.name); } } var person = new Person('kk', 12, 'IT'); console.log(person);
4、原型模式创建对象
构造函数创建对象,通过原型添加对象属性和方法。
function Person() { } Person.prototype.name = "kk"; Person.prototype.age = 12; Person.prototype.job = "IT"; Person.prototype.sayName = function () { console.log(this.name); }; var person = new Person(); console.log(person);
5、组合使用构造函数模式和原型模式
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; } Person.prototype.sayName = function () { console.log(this.name); } var person = new Person('kk', 12, 'IT'); console.log(person);
6、动态原型模式创建对象
动态原型模式把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),又保持了同时使用构造函数和原型的优点。
function Person(name,age,job){ //属性 this.name = name; this.age = age; this.job = job; //方法 if(typeof this.sayName != "function"){ Person.prototype.sayName = function(){ console.log(this.name); } } } var person = new Person("kk" , 12, "IT"); console.log(person);
7、寄生构造函数模式
这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象;但从表面上看,这个函数又很像是典型的构造函数。
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 person = new Person('kk',12,'IT'); console.log(person);
8、稳妥构造函数模式
所谓稳妥对象,指的是没有公共属性,而且其方法也不可引用this的对象。稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用this和new),或者在防止数据被其他应用程序(如Mashup程序)改动时使用。
稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同:一是新创新对象的实例方法不引用this;二是不使用new操作符调用构造函数。
function Person(name,age,job){ //创建要返回的对象 var o = new Object(); o.sayName = function(){ return name; }; //返回对象 return o; } var person = new Person('kk',12,'IT'); console.log(person);
9、代码资源
js代码实例中的createObject.js的文件中包含了本篇博客的代码,创建对象的几种实现方式在其中都有包括,希望能对读者有所帮助。