`
Clayz
  • 浏览: 298510 次
  • 性别: Icon_minigender_1
  • 来自: 东京
社区版块
存档分类
最新评论

JavaScript语言精粹读书笔记

 
阅读更多

部分例子摘自《JavaScript语言精粹》

 

JavaScript的简单类型包括数字,字符串,布尔值,null值和undefined值,其他所有的值都是对象。数字,字符串,布尔值貌似对象,因为他们拥有方法,但他们是不可变的。JavaScript中的对象是可变的键控集合。对象通过引用来传递,他们永远不会被拷贝。

 

对象字面量

对象字面量就是包围在一对花括号中的零或多个“名/值”对。对象字面量可以出现在任何允许表达式出现的地方。所有通过对象字面量创建的对象都连接到Object.prototype这个JavaScript中标准的对象。

var stooge = {
	first_name: "Clay",
	last_name: "Zhong"
};

 

对象检索

如果尝试检索一个并不存在的成员元素的值,将返回一个undefined值:

stooge["middle_name"] //undefined
stooge.middle_name     //undefined

 

此时可用||运算符来填充默认值:

var middle_name = stooge["middle_name"] || "none";
var middle_name = stooge.middle_name || "unknown";

 

尝试检索一个undefined的属性值将会导致TypeError,这可以通过&&运算符来避免:

stooge.film                                   //undefined
stooge.film.name                         //throw TypeError
stooge.film && stooge.film.name //undefined

 

在JavaScript中函数也是对象,函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。函数对象也可以被定义在其他函数中。函数对象可以通过函数字面量来创建:

var add = function(a, b) {
	return a + b;
}

 

函数调用

在JavaScript中一共有四种调用模式:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。

 

方法调用模式:

当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。

var myObject = {
	value: 0;
	increment: function(inc) {
		this.value += typeof inc === 'number' ? inc : 1;
	}
}

myObject.increment();
document.writeln(myObject.value);

 

函数调用模式:

当一个函数并非一个对象的属性时,那么它被当作一个函数来调用。

var sum = add(3, 4);

 

构造器调用模式:

如果在一个函数前面带上new来调用,那么将创建一个隐藏链接到该函数的prototype成员的新对象,同时this将会被绑定到那个新对象上。

//创建一个名为Quo的构造函数,它构造一个带有status属性的对象
var Quo = function(string) {
	this.status = string;
};
//给Quo的所有实例提供一个名为get_status的公共方法
Quo.prototype.get_status = function() {
	return this.status;
}
//构造一个Quo实例
var myQuo = new Quo("confused");
document.writeln(myQuo.get_status());

 

Apply调用模式:

apply方法让我们构建一个参数数组并用其去调用函数,它也允许我们选择this的值。apply方法接收两个参数,第一个是将被绑定给this的值,第二个就是一个参数数组。

var array = [3, 4];
var sum = add.apply(null, array);

 

闭包

和前面的以对象字面量形式去初始化myObject不同,我们通过调用一个函数的形式去初始化myObject,该函数将返回一个对象字面量。此函数定义了一个value变量,该变量对increment和getValue方法总是可用的,但函数的作用域使得它对其他程序来说是不可见的。

var myObject = function() {
	var value = 0;
	return {
		increment: function(inc) {
			value += typeof inc === 'number' ? inc : 1;
		},
		getValue: function() {
			return value;
		}
	}
}();
 

前面的Quo构造器产生出带有status属性和get_status方法的一个对象。但为什么要用一个getter方法去访问你本可以直接访问到的属性呢?如果status是私有属性时,它才更有意义。所以,让我们定义另一种形式的quo函数来做此事:

var quo = function(status) {
	return {
		get_status: function() {
			return status;
		}
	}
}

var myQuo = quo("amazed");
document.writeln(myQuo.get_status());

 

继承

伪类,基于new操作符的构造器调用继承,应避免使用此模式。

var Father = function(name) {
	this.name = name;
};
Father.prototype.getName = function() {
	return this.name;
}

var Son = function(age) {
	this.age = age;
}
Son.prototype.getAge = function() {
	return this.age;
}

Son.prototype = new Father("father");
document.writeln(new Son(12).getName());

 

伪类模式本意是想向面向对象靠拢,但它看起来格格不入。我们可以隐藏一些丑陋的细节,这是通过使用method方法定义一个inherits方法来实现的:

Function.method("inherits", function(Parent) {
	this.prototype = new Parent();
	return this;
});

var Son = function(age) {
	this.age = age;
}.inherits(Father).method("getAge", function() {
	return this.age;
});

 

原型

基于原型的继承相比于基于类的继承在概念上更为简单:一个新对象可以继承一个旧对象的属性。

if (typeof Object.beget !== "function") {
	Object.beget = function(o) {
		var F = function() {};
		F.prototype = o;
		return new F();
	}
}

var father = {
	name: "father",
	getName: function() {
		return this.name;
	}
}
var son = Object.beget(father);
alert(son.getName());
 
分享到:
评论

相关推荐

    JavaScript 精粹读书笔记(1,2)

    在《JavaScript 精粹》一书中,作者深入探讨了JavaScript的特性和最佳实践,旨在帮助开发者区分和利用其精华部分,同时避免那些可能会引起问题的鸡肋特性。 首先,JavaScript的某些特性带来了麻烦,因为其规范的不...

    JavaScript 语言精粹学习笔记第1/2页

    JavaScript是一种广泛使用的高级、解释型编程语言,它以其函数式编程的特性、弱类型系统、动态对象和富有表现力的对象字面量而闻名。然而,它同样存在着基于全局变量的编程模型这一缺点。JavaScript的函数基于词法...

    ASP数据库开发实例精粹

    ASP是一种服务器端脚本语言,由微软公司推出,用于在Web服务器上创建动态网页。它的主要优势在于能够与多种数据库系统无缝集成,如Microsoft Access、SQL Server、MySQL等。通过ASP,开发者可以编写代码来处理用户...

    javascript 精粹笔记

    标题为“javascript 精粹笔记”的这份文档显然是一份针对JavaScript语言的学习和应用技巧的集合。JavaScript是一种广泛应用于Web前端开发的脚本语言,随着互联网技术的发展,JavaScript的应用越来越广泛,不仅限于...

    angularJS笔记

    javascript:闭包 作用域 原型 Javascript权威指南 Javascript高级程序员设计 Javascript语言精粹 Javascript模式

    计算机书籍读书笔记.docx

    ### 计算机书籍读书笔记知识点汇总 #### 第一篇:CSS精粹之布局技巧 **1. 错误检测的重要性** - 在遇到CSS布局问题时,及时进行代码检查可以帮助开发者快速定位并解决问题。 - **W3C提供的工具**:W3C提供XHTML...

    前端开发书籍推荐与学习路线.docx

    * 推荐书籍:JavaScript 高级程序设计、JavaScript 权威指南、JavaScript 语言精粹 * 学习方法:边实战边记笔记,不要光看,要有方法的快速阅读 三、JavaScript 进阶 * 推荐书籍:《你不知道的 JavaScript》 * ...

    《COM原理与应用》全书笔记

    ### COM原理与应用全书笔记精粹 #### 一、COM基本概念与接口设计 COM(Component Object Model)是微软提出的一种组件对象模型,旨在实现跨语言、跨平台的组件互操作性。在C++中,COM通过接口(Interface)来实现...

Global site tag (gtag.js) - Google Analytics