第六章
面向对象的程序设计

1.定义只有在内部才用的特性(attribute)时,描述了属性(property)的各种特征。这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们。为了表示特性是内部值,该规范把它们放在了两对方括号中,例如[[Enumerable]]。

2.数据属性

  [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,默认为true,一旦改为false不能再把它变回可配置了。

  [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true。

  [[Writable]]:表示能否修改属性的值,默认为true。

  [[Value]]:包含这个属性的数据值,默认为undefined,只可读。

3.要修改属性默认的特性,必须使用ES5的Object.definePropert()方法。这个方法接受三个参数:属性所在的对象,属性的名字和一个描述符对象。

4.访问器属性

  [[Configurable]]

  [[Enumerable]]

  [[Get]]:在读取属性时调用的函数。默认undefined

  [[Set]]:在写入属性时调用的函数。默认undefind

访问器属性不能直接调用,必须使用Object.defineProperty()

_year,起那么加下划线是一种常用的标记,用于表示只能通过对象方法访问的属性。

5.工厂模式

  1. function createPerson(name,age,job){
  2. var o = new Object();
  3. o.name = name;
  4. o.age = age;
  5. o.job = job;
  6. o.sayName = function(){
  7. alert(this.name);
  8. };
  9. return o;
  10. }
  11. var person1 = createPerson("Nicholas",29,"Software Engineer");
  12. var person = createPerson("Grey",27,"Doctor");

6.构造函数模式

  1. function Person(name,age,job){
  2. this.name = name;
  3. this.age = age;
  4. this.job = job;
  5. this.sayName = function(){
  6. alert(this.name);
  7. };
  8. }
  9. var person1 = new Person("Nicholas",29,"Software Engineer");
  10.  
  11. var person2 = new Person("Nicholas",29,"Software Engineer");

跟工厂模式的区别:1.没有显示地创建对象 2.直接将属性和方法赋给了this对象 3.没有return语句

7.创建一个实例经过的步骤

  1.创建一个新对象

  2.将构造函数的作用域赋给新对象(因此this就指向了这个新对象)

  3.执行构造函数中的代码(为这个新对象添加属性)

  4.返回新对象

8.person1根person2保存着不同的实例,但是两个对象都有一个constructor(构造函数)属性,指向Person

  person1 instanceof Person == true

创建自定义构造函数意味着将来可以将它的实例标识为一种特定的类型,而这正是构造函数模式胜于工厂模式的地方

9.创建的每一个函数都有一个prototype(原型)属性。

使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必再构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。

10.代码读取属性时候,如果在实例中找到了具有给定名字的属性,则返回该属性的值,如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。

11.

  1. function Person(){
  2. }
  3. var friend = new Person();
  4. Person.prototype = {
  5. constructor:Person,
  6. name: "Nicholas",
  7. age : 29,
  8. job : "Student"
  9. sayName : function(){
  10. alert(this.name);
  11. }
  12. };
  13. friend.sayName();

重写原型对象切断了现有原型与任何之前已经存在的对象之间的联系;它们的引用任然是最初的原型。

搞错 不应该报这个错误,原因是我在上面的job的后面少了个,所以导致出现这个错误,是语法错误的意思

改完后

12.不建议修改原生对象的原型,因为不同分支如果都重写,可能造成命名冲突。

13.原型对象的最大问题是其共享的本性所导致。

14.组合使用构造函数模式和原型模式,每一个实例都会有自己的一份实例属性的副本,但同时又共享着对方的引用了,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数。

  1. function Person(name, age, job){
  2. this.name = name;
  3. this.age = age;
  4. this.job = job;
  5. this.friends = ["shelby","court"];
  6. }
  7. Person.prototype = {
  8. constructor : Person,
  9. sayName : function(){
  10. alert(this.name);
  11. }
  12. }
  13. var person1 = new Person("zs", 12, "student");
  14. var person2 = new Person("ls", 11, "doc");
  15. person1.friends.push("van");
  16. alert(person1.friends);//shelby,count,van
  17. alert(person2.friends);//shelby,count
  18. alert(person1.friends === person2.friends);//false
  19. alert(person1.sayName === person2.sayName);//true

15.and 寄生构造函数模式,稳妥构造函数模式。instanceof操作符对这种对象都没意义。

16.javascript的继承主要依靠原型链来实现,

比如,1,先搜索实例  2,往上层原型搜索 3,往更上层原型搜索

17.原型链的问题也是原型属性实例共享。解决这个问题用借用构造函数。(这两种技术都很少单独使用)

18.组合继承

  1. function SuperType(name){
  2. this.name = name;
  3. this.colors = ["red","blue","green"]
  4. }
  5. SuperType.prototype.sayName = function(){
  6. alert(this.name);
  7. }
  8. function SubType(name, age){
  9. // 继承属性
  10. SuperType.call(this,name);
  11. this.age = age;
  12. }
  13. // 继承方法
  14. SubType.prototype = new SuperType();
  15. SubType.prototype.constructor = SubType;
  16. SubType.prototype.sayAge = function(){
  17. alert(this.age);
  18. };
  19.  
  20. var instance1 = new SubType("Nicholas",29);
  21. instance1.colors.push("black");
  22. alert(instance1.colors); // "red,blue,green,black"
  23. instance1.sayName(); // "Nicholas"
  24. instance1.sayAge(); //
  25.  
  26. var instance2 = new SubType("Grey",27);
  27. alert(instance2.colors); // "red,blue,green,black"
  28. instance2.sayName(); // "Grey"
  29. instance2.sayAge(); //

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为js中最常用的继承模式。而且instanceof 和isPrototypeof()也能够用于识别基于组合继承创建的对象。

JavaScript高级程序设计(第三版) 6/25的更多相关文章

  1. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  2. javascript高级程序设计第三版书摘

    在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...

  3. 22.1 高级函数【JavaScript高级程序设计第三版】

    函数是JavaScript 中最有趣的部分之一.它们本质上是十分简单和过程化的,但也可以是非常复杂和动态的.一些额外的功能可以通过使用闭包来实现.此外,由于所有的函数都是对象,所以使用函数指针非常简单 ...

  4. DOM 操作技术【JavaScript高级程序设计第三版】

    很多时候,DOM 操作都比较简明,因此用JavaScript 生成那些通常原本是用HTML 代码生成的内容并不麻烦.不过,也有一些时候,操作DOM 并不像表面上看起来那么简单.由于浏览器中充斥着隐藏的 ...

  5. 21.1 XMLHttpRequest 对象【JavaScript高级程序设计第三版】

    IE5 是第一款引入XHR 对象的浏览器.在IE5 中,XHR 对象是通过MSXML 库中的一个ActiveX对象实现的.因此,在IE 中可能会遇到三种不同版本的XHR 对象,即MSXML2.XMLH ...

  6. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  7. 14.5 富文本编辑【JavaScript高级程序设计第三版】

    富文本编辑,又称为WYSIWYG(What You See Is What You Get,所见即所得).在网页中编辑富文本内容,是人们对Web 应用程序最大的期待之一.虽然也没有规范,但在IE 最早 ...

  8. JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

    null.NaN.undefined三者的区别是什么? 在初次接触到JavaScript的时候,傻傻的分不清null.NaN.undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑 ...

  9. 4.2 执行环境及作用域【JavaScript高级程序设计第三版】

    执行环境(execution context,为简单起见,有时也称为“环境”)是JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环 ...

  10. 13.4.3 鼠标与滚轮事件【JavaScript高级程序设计第三版】

    鼠标事件是Web 开发中最常用的一类事件,毕竟鼠标还是最主要的定位设备.DOM3 级事件中定义了9 个鼠标事件,简介如下. click:在用户单击主鼠标按钮(一般是左边的按钮)或者按下回车键时触发.这 ...

随机推荐

  1. Netty 源码解析(四): Netty 的 ChannelPipeline

    今天是猿灯塔“365篇原创计划”第四篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty ...

  2. java实现在一个字符串中查找某个子字符串出现的次数

    public static void main(String[] args) { String a = "我爱我的祖国!!!"; String b = "爱"; ...

  3. 线性dp打鼹鼠

    题目大意 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个 的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气.你可 ...

  4. POJ 3631 Cow Relays Floyd+矩阵快速幂

    题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...

  5. CentOS7下安装和配置SVN

    1. 由于是在CentOS7最小化安装的操作系统环境安装SVN,我们首先排除一些环境因素.在此首先关闭了防火墙,安装了vim文本编辑工具.   2. 使用yum install -y subversi ...

  6. Flask——实现上传功能

    1.实例 #!-*-coding=utf-8-*- # from flask import Flask # # app = Flask(__name__) # # # @app.route('/') ...

  7. 基本数据类型--------------------集合set()

    一.作用:集合.list.tuple.dict一样都可以存放多个值,但是集合主要用于:关系运算.去重 # 1.1 关系运算 friends1 = ["zero","kev ...

  8. day48 navicat使用及pymysql的使用

    目录 一.navicat介绍 1 基本使用 2 练习题 2.1 查询所有的课程的名称以及对应的任课老师姓名 2.2 查询平均成绩大于八十分的同学的姓名和平均成绩 2.3 查询没有报李平老师课的学生姓名 ...

  9. Scala 基础(七):Scala 运算符

    1 算术运算符 算术运算符(arithmetic)是对数值类型的变量进行运算的,在Scala程序中使用的非常多. 细节说明: 1)对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留 ...

  10. 机器学习实战基础(三十):决策树(三) DecisionTreeRegressor

    DecisionTreeRegressor class sklearn.tree.DecisionTreeRegressor (criterion=’mse’, splitter=’best’, ma ...