JavaScript面向对象
2016-10-09 09:41
295 查看
javaScript面向对象
面向对象的特征:
封装继承
多态
JavaScript中没有多态,只有继承和封装
JavaScript如何实现封装?
javascript是一种基于对象的语言,但又不是一种真正的面向对象的语言,它没有类,所以要把属性和方法封装在对象中。在js中怎样得到一个对象呢?
1.json方式
var Person={ name:"liyanan", age:"21", say:function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); } }; var me=new Person(); me.say();
2.直接new一个object对象(不常用)
var cat=new Object(); cat.name="liyanan"; cat.age=21; cat.say=function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); };
注:上面两种得到对象的方式存在缺陷,主要缺陷:
1.因为没有类的约束,使得程序员没有一个统一的规范来写
2.没办法实现对象的重用
3.使用工厂方式创建对象
function createObject(name,age){ var o=new Object(); o.name=name; o.age=age; o.say=function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); } return o; } var p1=createObject("liyanan",21); p1.say();
注:这种方式创建对象,虽然解决了上面的两个问题,但是我们没有办法判断函数的类型。
4.使用构造函数创建对象
function Person(name,age){ this.name=name;//this会绑定在实例对象上 this.age=age; this.say=function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); } } var p1 = new Person("liyanan",21); var p1 = new Person("lyn",19); p1.say(); p2.say(); alert(typeof(p1));//等于alert(typeof p1); alert(p1.instanceof Person);//判断p1是否是Person类型,返回true or false. alert(p1.constructor == Person);//constructor指向它们的构造函数 //p1和p2的say()方法是一样的,每次调用这个方法就会开辟一块内存,并且这块内存还不会被回收,因此构造函数方式创建对象也存在内存消耗的缺陷。
注:使用构造函数方式创建对象解决了使用工厂模式不能判断对象的类型的缺陷。但是,使用构造函数构造对象的方法,对象在调用函数之后,不会自动释放内存,造成对内存的大量消耗。在对象使用完毕后,使用p1=null;将对象置空,可以回收这块对象指向的内存。
解决内存消耗
function Person(name,age){ this.name=name;//this会绑定在实例对象上 this.age=age; this.say=say; } function say(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); } var p1=new Person("liyanan",13); var p2=new Person("lyn",12); p1.say(); p2.say(); //现在p1,p2指向同一块say()内存.
注:这种方式虽然解决了内存消耗,但是此时say()变成了全局函数,不符合对象的封装标准,为了解决这个问题,可以使用原型方式创建对象。
5.使用原型Prototype定义对象
Javascript规定,每一个函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。//使用prototype方式创建对象 function Person(){ } //原型的扩充 Person.prototype.name="liyanan"; Person.prototype.age=13; Person.prototye.say=function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); }
//使用Prototype创建对象的第二种方式 function Person(){ } //原型的重写 Person.prototype={ constructor:Person,//当原型重写了 bd4a 之后,手动将构造器指向Person name:"lyn", age:13, say:function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); } };
封装:要把对象的属性和方法进行封装
6.基于组合(构造函数加原型)的封装(常用):
function Person(name,age){ //构造函数定义属性 this.name=name; this.age=age; } //原型定义方法 Person.prototype.say=function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); } var p1=new Person("liyanan",13); p1.say();//我的名字是:liyanan,我的年龄是
注:
7.基于动态原型链的方式(选学)
function Person(){ this.name=name; this.age=age; if(!Person.prototype.say){ Person.prototype.say=function(){ alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age); } } }
相关文章推荐
- 一个简单的、面向对象的javascript基础框架
- 面向对象的JavaScript编程
- 【javascript】javascript面向对象(妙味版)
- JavaScript面向对象练习之计时器
- JavaScript基础笔记(四) JS式面向对象
- JavaScript [面向对象] prototype
- JavaScript面向对象学习笔记——函数、匿名函数、回调函数、自调函数
- JavaScript 面向对象(一)
- Javascript面向对象之:原型(prototype)和基于原型的对象系统
- javascript面向对象(十二)
- 面向对象在javascript中的实践之大杂烩
- javascript面向对象之Javascript 继承
- 重新认识JavaScript面向对象: 从ES5到ES6
- Javascript面向对象之创建对象
- 重新认识JavaScript面向对象: 从ES5到ES6
- JavaScript使用面向对象的技术创建高级 Web 应用程序
- 面向对象的JavaScript-1.语言特征
- JavaScript面向对象之静态与非静态类
- 如何编写可维护面向对象的JavaScript代码