Javascript面向对象编程 产生对象
2014-01-24 19:54
267 查看
Javascript是一种基于对象(Object-Based)的编程语言,常说在javascript中一切都是对象,那么对象究竟是怎么产生的呢?
(一)原始模式
首先说一下我们常见的对象——Object实例。创建Object实例方式有很多,第一种是使用new操作符后跟Object构造函数:
(二)工厂模式
这样每次调用createPerson函数,传入两个参数我们就可以创建一个person实例。这样虽然可以创建对象,但是仍然不能体现“类”与对象实例的关系。
(三)构造函数模式
所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。
这样我们就可以通过new Person构造函数创建一个实例对象,慢慢地和我们所认知的“类”与对象实例的关系接近了,我们再进一步拓展一下这个构造函数(毕竟实际当中人的属性总不单name和age吧)。
我们为对象添加了type属性和speek方法。可我们发现,每一个实例对象,type属性和speak()方法都是一模一样的内容,每生成一个实例,都必须为重复的内容,多占用一些内存,这样势必会造成大量的内存浪费,那有没有比较方法把一模一样的内容单独拿出来共享呢,让所有的实例对象都能访问?
(四)原型模式(Prototype模式)
Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。那我们可以把那些一模一样的内容(不变的属性和方法),直接定义在prototype对象上。
这种方式其实就是常说的构造函数模式+原型模式,就是将不同的部分放在构造函数中去构造,把相同的部分放在原型中去共享继承。
总结:结合上面四种对象产生方式,我们可以根据实际开发需要去创造我们需要的对象,其实,四种模式并没主次优劣之分,只要能最大限度节省内存和代码复用高效才是最好的方式。
(一)原始模式
首先说一下我们常见的对象——Object实例。创建Object实例方式有很多,第一种是使用new操作符后跟Object构造函数:
var person=new Object(); person.name="张三"; person.age=21;另一种方式是对象字面量表示法:
var person={ name:"张三", age:21 }这两种方式是生成对象的原始模式。这样写有个很明显的弊端:如果我们需要n多个person对象,那么我们编码是相当罗嗦苦逼的。既然这样,那我们需要一个工厂去批量生产这些person实例。
(二)工厂模式
function createPerson(name,age){ var o=new Object(); o.name=name; o.age=age; return o; }<br> var person1=createPerson("张三",20); var person2=createPerson("李四",21);
这样每次调用createPerson函数,传入两个参数我们就可以创建一个person实例。这样虽然可以创建对象,但是仍然不能体现“类”与对象实例的关系。
(三)构造函数模式
所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。
function Person(name,age){ this.name=name; this.age=age; } var person1=new Person("张三",21); var person2=new Person("李四",20);
这样我们就可以通过new Person构造函数创建一个实例对象,慢慢地和我们所认知的“类”与对象实例的关系接近了,我们再进一步拓展一下这个构造函数(毕竟实际当中人的属性总不单name和age吧)。
function Person(name,age){ this.name=name; this.age=age; this.type="高级动物"; this.speak=function(){ alert(this.name); } } var person1=new Person("张三",21); var person2=new Person("李四",20);
我们为对象添加了type属性和speek方法。可我们发现,每一个实例对象,type属性和speak()方法都是一模一样的内容,每生成一个实例,都必须为重复的内容,多占用一些内存,这样势必会造成大量的内存浪费,那有没有比较方法把一模一样的内容单独拿出来共享呢,让所有的实例对象都能访问?
(四)原型模式(Prototype模式)
Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。那我们可以把那些一模一样的内容(不变的属性和方法),直接定义在prototype对象上。
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.type="高级动物"; Person.prototype.speak=function(){ alert(this.name); } var person1=new Person("张三",21); var person2=new Person("李四",20); console.log(person1.type); console.log(person2.type); person1.speak(); person2.speak();
这种方式其实就是常说的构造函数模式+原型模式,就是将不同的部分放在构造函数中去构造,把相同的部分放在原型中去共享继承。
总结:结合上面四种对象产生方式,我们可以根据实际开发需要去创造我们需要的对象,其实,四种模式并没主次优劣之分,只要能最大限度节省内存和代码复用高效才是最好的方式。
相关文章推荐
- Javascript面向对象编程(一):对象的产生
- javascript 面向对象编程 万物皆对象
- 转载:Javascript面向对象编程原理 -- 理解对象
- Javascript 面向对象编程(二):如何生成一个对象
- javascript 面向对象编程 聊聊对象的事
- 由面向对象编程以及RESTful软件架构学习产生的想法(面向对象服务器设计)
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第29讲_二维数组转置_js面向对象编程介绍 类(原型对象)和对象_学习笔记_源代码图解_PPT文档整理
- javascript面向对象编程的学习---对象继承
- JavaScript面向对象编程(对象创建)
- javascript面向对象编程的学习---对象继承
- javascript 面向对象编程 聊聊对象的事
- 面向对象编程,C#,Java中都有this,this代表了当前的对象,那么JavaScript中this代表什么
- javascript 面向对象编程 万物皆对象
- 韩顺平 javascript教学视频_学习笔记12_js面向对象编程介绍_类(原型对象)和对象
- javascript”面向对象编程”- 2聊聊对象的事
- JavaScript内置对象Math 产生随机整数
- JavaScript面向对象编程之prototype对象
- JavaScript面向对象编程之对象的属性
- [转]Javascript面向对象编程(三):非函数对象的继承
- Javascript之面向对象编程(创建对象)