面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装、继承、多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义JS中对象:无序属性的集合,其属性可以包含基本值、对象或者函数。可以简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)。

1、json格式的面向对象,一个命名空间;适合模块化开发插件。不同的模块使用不同的命名空间。也可用于小型项目的开发。

var person = {
name : 'My name',
age : 18,
getName : function(){
return this.name;
}
}

2、组合构造函数及原型模式

目前最为常用的定义类型方式,是组合构造函数模式与原型模式。构造函数模式用于定义实例的属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方方法的引用,最大限度的节约内存。此外,组合模式还支持向构造函数传递参数,可谓是集两家之所长。

function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.lessons = ['Math', 'Physics'];
}
Person.prototype = {
constructor: Person,//原型字面量方式会将对象的constructor变为Object,此外强制指回Person
getName: function () {
return this.name;
}
}
var person1 = new Person('Jack', 19, 'SoftWare Engneer');
person1.lessons.push('Biology');
var person2 = new Person('Lily', 39, 'Mechanical Engneer');
alert(person1.lessons);//Math,Physics,Biology
alert(person2.lessons);//Math,Physics
alert(person1.getName === person2.getName);//true,//共享原型中定义方法

原型模式的缺点是如果属性值是引用类型,那么会造成修改一个对象的这个属性,另一个对象的这个属性也变了。

构造函数模式的缺点是同一种方法每一个实例都有,而不是共享方法。不够优化。

继承

属性的继承:

function Worker(name,age,job){
Person.call(this,name,age); //属性的继承。
this.job = job;
}

方法的继承:

Worker.prototype = {};
for(var i in Person.prototype){
Worker.prototype[i] = Person.prototype[i];
}
Worker.prototype.sayJob = function(){
alert(this.job)
}

完整的继承:

function Person(name,age){
this.name = name;
this.age = age;
this.friends = ['Shelby','Court'];
}
Person.prototype = {
sayName:function(){
alert(this.name);
}
}
function Worker(name,age,job){
Person.call(this,name,age); //属性的继承。
this.job = job;
}
Worker.prototype = {};
for(var i in Person.prototype){
Worker.prototype[i] = Person.prototype[i];
}
Worker.prototype.sayJob = function(){
alert(this.job)
}
var w = new Worker('li',12,'打杂的');
var p = new Person('ai',21);
w.sayName();
w.sayJob();
p.sayName();
p.sayJob();

最新文章

  1. Spring resource bundle多语言,单引号format异常
  2. servletFileUpload
  3. 整理的一些免费的Android项目实战系列视频教程
  4. Some_sort_algorithms
  5. Hadoop源码的编译过程详细解读(各版本)
  6. [SCOI2005]互不侵犯King
  7. sql查询百分号的方法
  8. springmvc传递json数据到前台显示
  9. FIFO存储器
  10. ElasticSearch核心知识 -- 索引过程
  11. intellij idea的安装步骤---经典
  12. BZOJ4943 [NOI2017] 蚯蚓
  13. Swift Struct 结构体
  14. [IR] Advanced XML Compression - XBW
  15. 【BZOJ】2815: [ZJOI2012]灾难
  16. 【linux基础】CMake如何生成动态链接库文件
  17. Golang如何使用websocket
  18. 单细胞测序技术(single cell sequencing)
  19. 【代码备份】ZJ10086测试环境成功代码备份
  20. 弹窗中使用jquery ui的autocomplete自动完成插件无效果 实际是被遮挡了

热门文章

  1. html5--1.20 课程小结与若干点补充
  2. COM组件宏观认识
  3. MySQL上周新增激活用户在上周下单情况_20161107周一
  4. ACM学习历程——POJ1260 Pearls(动态规划)
  5. Set_ML
  6. 推荐几个Laravel 后台管理系统
  7. KMP匹配
  8. [poj1741]Tree(点分治+容斥原理)
  9. 面试总结hashmap
  10. CentOS快速搭建LAMP环境