一.创建对象

  • 工厂模式。使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。【问题:没有解决对象识别问题】
  •  1 function createPerson(name, age) {
    2 var o = new Object();
    3 o.name = name;
    4 o.age = age;
    5 o.sayName = function() {
    6 console.log(this.name);
    7 }
    8 return o;
    9 }
    10
    11 var p1 = createPerson("p1", "10");
    12 p1.sayName(); //p1
    13 console.log(p1 instanceof Object); //true
    14 console.log(p1 instanceof createPerson); //false
  • 构造函数模式。可以创建自定义引用类型,可以像创建内置对象实例一样使用new操作符。缺点:每个成员都无法得到复用。
  •  1 function Person(name, age) {
    2 this.name = name;
    3 this.age = age;
    4 this.sayName = function() {
    5 console.log(this.name);
    6 }
    7 }
    8 var p2 = new Person("p2", 11);
    9 p2.sayName(); //p2
    10 console.log(p2 instanceof Object); //true
    11 console.log(p2 instanceof Person); //true
  • 原型模式。使用构造函数的prototype属性来指定那些应该共享的属性和方法。
  •  1 function person(name) {
    2 }
    3 person.prototype.name = "person";
    4 person.prototype.sayName = function() {
    5 console.log(this.name);
    6 }
    7 var p3 = new person();
    8 var p4 = new person();
    9 p3.sayName();//person
    10 console.log(p3.sayName == p4.sayName);//true
  • 组合使用构造函数模式和原型模式。使用构造函数定义实例属性,而使用原型定义共享的属性和方法。
  •  1 function p(name) {
    2 this.name = name;
    3 }
    4 p.prototype.sayName = function() {
    5 console.log(this.name);
    6 }
    7 var p5 = new p("p5");
    8 var p6 = new p("p6");
    9 p5.sayName();//p5
    10 p6.sayName(); //p6
    11 console.log(p5 instanceof Object); //true
    12 console.log(p5 instanceof p); //true
    13 console.log(p5.constructor instanceof Function);//true

二.继承

  • 通过原型链继承。
  • 注意点1:使用字面量添加新方法会重写原型链。
 function SuperType() {
this.property = true;
} SuperType.prototype.getSuperValue = function() {
return this.property;
} function SubType() {
this.subproperty = false;
} //继承了SuperType
SubType.prototype = new SuperType(); //使用字面量添加新方法,会导致上一行代码无效。因为这样重写了原型链
SubType.prototype = {
getSubValue : function() {
return this.property;
}, someOtherMethod : function() {
return false;
}
}; var instance = new SubType();
console.log(instance.getSuperValue()); //error
  • 注意点二:包含引用类型值的原型属性会被所有实例共享。
  •  function SuperType() {
    this.colors = [1,2,3];
    } function SubType() {
    } SubType.prototype = new SuperType();
    var instance1 = new SubType();
    instance1.colors.push(4);
    console.log(instance1.colors); //[ 1, 2, 3, 4 ] var instance2 = new SubType();
    console.log(instance2.colors); //[ 1, 2, 3, 4 ]
  • 借用构造函数。在子类型构造函数的内部调用超类型构造函数。
  •  function SuperType() {
    this.colors = [1,2,3];
    } function SubType() {
    SuperType.call(this);
    } SubType.prototype = new SuperType();
    var instance1 = new SubType();
    instance1.colors.push(4);
    console.log(instance1.colors); //[ 1, 2, 3, 4 ] var instance2 = new SubType();
    console.log(instance2.colors); //[ 1, 2, 3]
    /*在新的SubType对象上执行SuperType()函数中定义的所有对象初始化代码。所以,SubType的每个实例就会具有自己的colors属性的副本了。*/
  • 组合继承。使用原型链实现对原型属性和方法的继承。而通过借用构造函数来实现对实例属性的继承。这样,即通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。
  •  function Super(name) {
    this.name = name;
    this.num = [1,2,3];
    } Super.prototype.SayName = function() {
    console.log(this.name);
    }; function sub(name, age) {
    //继承属性
    Super.call(this, name);
    this.age = age;
    }
    //继承方法
    sub.prototype = new Super();
    sub.prototype.constructor = sub;
    sub.prototype.SayAge = function() {
    console.log(this.age);
    } var i1 = new sub("i1", 29);
    i1.num.push(4);
    console.log(i1.num);//[ 1, 2, 3, 4 ]
    i1.SayAge(); //
    i1.SayName(); //i1 var i2 = new sub("i2", 27);
    console.log(i2.num); //[ 1, 2, 3]
    i2.SayAge(); //
    i2.SayName(); //i2

JavaScript 高级程序设计(第3版)笔记——chapter6:面向对象的程序设计的更多相关文章

  1. javaScript高级程序设计第3版笔记

    <script src = "xxx.js" defer = "defer"> </script> 在引用外部script时,<s ...

  2. Javascript高级程序设计第三版-笔记

    1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...

  3. 《JavaScript高级程序设计》笔记:面向对象的程序设计(六)

    面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象. 理解对象 创建自定义对象的最简单的方法就是创建一个Object的实例,然后再为它添加属性和方法.例 ...

  4. javascript 高级程序设计学习笔记(面向对象的程序设计) 1

    Object构造函数或对象字面量都可以用来创建对象,但这些方式有个明显的缺点:使用相同一个接口创建很多对象,会产生大量重复代码. 工厂模式 //工厂模式 function createDog (nam ...

  5. javascript 高级程序设计学习笔记(面向对象的程序设计)继承

    ECMAScript中描述了原型链的概念,原型链是实现继承的主要方法. 实现原型链继承有一种基本模式 function SuperType () { this.property = true; } S ...

  6. javascript 高级程序设计学习笔记(面向对象的程序设计) 2

    在调用构造函数时会为实例添加一个指向最初原型的指针,我们可以随时为原型添加属性和方法,并且能在实例中体现出来,但如果是重新了原型对象,那就会切断构造函数与最初原型的联系. function Dog ( ...

  7. 精读《javascript高级程序设计》笔记三——面向对象的程序设计

    重点来了,我认为这一章值得好好地反复地看.看第一遍 还是懵懵懂懂,现在看第二遍,终于能看出点意思了. 创建对象 工厂模式 function createPerson(name, age, job){ ...

  8. 《JAVASCRIPT 高级程序设计》读书笔记六 面向对象的程序设计

    一   对象属性 a.对象定义: 无序属性的集合,其属性可以包含基本值.对象或者函数: b.两种创建方式: 1.构造函数: var person = new Object(); person.name ...

  9. js高级教程第3版笔记(我的理解)陆续更新中

    js基础语法'use strict'(严格模式)定义变量var object;只声明未赋值,默认值为undefined;var object1=值;声明并赋值;function fun(a){这样也叫 ...

  10. 《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承

    一.理解对象 二.创建对象      1. 工厂模式      2. 构造函数模式      3. 原型模式      4. 组合使用构造函数模式和原型模式[使用最广泛]      5. 动态原型模式 ...

随机推荐

  1. Umbraco隐藏属性

    Umbraco默认的Url地址,是根据Node路径来默认显示的,因此使用中文的话比较尴尬. 网上有传的方法,是修改源码,来实现Url的重写. 但实际大可不必如此麻烦,只需要增加两个类型为Textstr ...

  2. 解决:eclipse导入android时工程下没有R文件的问题,以及style.xml文件报错

    解决:eclipse导入android时工程下没有R文件的问题,以及style.xml文件报错

  3. 57. Spring 自定义properties升级篇【从零开始学Spring Boot】

    之前在两篇文章中都有简单介绍或者提到过 自定义属性的用法: 25.Spring Boot使用自定义的properties[从零开始学Spring Boot] 51. spring boot属性文件之多 ...

  4. ListView 行高设置不起作用

    通常我们在自定义listview的时候会遇到这个问题,我们设置了每行的layout的高度,但是没起作用,那是因为在adapter里面getview的时候出的问题,通常我们写: view = mInfl ...

  5. ThinkPHP 3 的输出

    一.ThinkPHP 3 的输出 (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休要修改配置 ...

  6. android 解决ViewPager双层嵌套的滑动问题

    解决ViewPager双层嵌套的滑动问题 今天我分享一下ViewPager的双层嵌套时影响内部ViewPager的触摸滑动问题 之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就 ...

  7. jquery $.ajax $.get $.post的区别

    $.ajax 是 jQuery 底层 AJAX 实现,$.ajax是一种通用的底层封装,$.ajax()请求数据之后,则需要使用回调函数,有beforeSend.error.dataFilter.su ...

  8. mysql的函数

  9. Flex和Servlet结合上传文件报错(二)

    1.详细报错例如以下 一个表单域 不是一个表单域 java.io.FileNotFoundException: D:\MyEclipse\workspace\FlexFileUpload\Web\up ...

  10. XGPush集成(信鸽集成)demo

    #import "AppDelegate.h" #import "XGPush.h" #import "XGSetting.h" #defi ...