OOP-ECMAScript - 深入理解Javascript
一、面向对象概论
x = {a: 10};
y = {b: 20};
y.Prototype = x
z = {c: 30};
z.Prototype = y;
z.a; //
x.a = 100;
z.a; //
/*
基于原型的基本概念
1. 基本概念是对象
2. 对象动态可变,完全可以从一个类型转换成另一个类型
3. 对象不需要类
4. 对象可以有原型,当对象没法响应对应属性,则可以委托给原型
*/
// 一、 多态
//一个函数应用于不同对象
function test() {
}
test.call({ a: 10, b: 20 });
test.call({ a: 100, b: 200 });
var a = 1;
var b = 2;
test(); //1,2
//Date.prototype.getTime()例外,必须对应日期对象 new Date()===> Date.prototype.getTime.call(new Date());
// 二、封装
(function () {
//初始化上下文
}());
// 三、不支持多重继承:一个对象可以用来做直接原型
// 四、AOP特性
// 装饰者例子:新增一个判断条件,AOP切入报错
function Decorator(oldFunction) {
//匿名封装原有函数的执行,新增装饰的过程
return function () {
//新增装饰的业务
if (fooBar !='test') {
alert("wrong");
return false;
}
//执行原有函数
return oldFunction();
}
}
function test() {
alert("right");
}
var checkTest = new Decorator(test);
var fooBar = false;
checkTest();
二、ECMAScript中的OOP
/*
ECMAScript:基于原型的委托式继承的面向对象语言
*/
/*
一、数据类型
1. 原始值
Undefined, Null, Boolean, String, Number, Object
Reference: 解释delete、typeof、this
List: 描述参数列表行为
Completion 解释break、continue、return、throw
*/
var a = undefined;
var b = null;
var c = true;
var d = 'test';
var e = 10;
// 2. Object类型
var x = {
a: 10,//原始值
b: { z: 100 },//对象
c: function () { }//函数
}
// 3. 动态性:程序执行时可随意增删改对象属性
var foo = { x: 20 };
foo.y = 30;//新增
foo.x = function () { }//修改
delete foo.x;
//静态对象不能修改
Object.freeze(foo);//此时属性不能进行任何操作
//设置属性只读、不可配置
Object.defineProperty(foo, "y", {
value: 20,
writable: false, //不可写
configurable: false //不可配置
});
// 4. Boolean、String、Number对象:由内置构造函数创建
var c = new Boolean(true);
var d = new String('test');
var e = new Number(10);
// 转换成原始值
// 使用不带new关键字的函数
c = Boolean(c);
d = String(d);
e = Number(e);
// 重新转换成对象
c = Object(c);
d = Object(d);
e = Object(e);
//其他内置构造函数创建:Function、Array、RexExp、Math、Date
/*
二、构造函数
*/
function A(x) { }//构造函数
var a = new A();
/*
三、原型
*/
function A() {
this.x = 10;
}
var a = new A();
A.prototype.y = 20;
a.y;//undefined var b = new A();
b.y = 20;
/*
四、读写特性
*/
//Get方法
(function () {
if (O.hasOwnProperty(P)) {
return O.P;
}
}());
//Set方法
(function () {
var foo = {};
foo.y = 30;//设置
}());
//属性访问器,针对对象
var foo = { a: 10 };
foo.a;
foo["a"]
//原始值报错:对原始值进行属性取值,先对对象包装,访问属性,然后删除属性
var a = 10;
a.toString(); //"10"
a.x = 4;
a.x //undefined var a = new Number(10);
a.toString();
a.x = 4;
delete a;//所以无法访问
三、OOP小测
//一
if (!("a" in window))
{
var a = 1;
}
alert(a);
//答案:undefined
//因为JavaScript引擎首先会扫描所有的变量声明,然后将这些变量声明移动到顶部
var a;
if (!("a" in window)) {
a = 1;
}
alert(a); //
var a = 1,
b = function a(x) { x && b(--x); };
alert(a);//永远是1
//填充VO的顺序是: 函数的形参 -> 函数申明 -> 变量申明 ->函数表达式
function a(x)
{
return x * 2;
}
var a;
alert(a); //function //
function b(x, y, a) {
arguments[2] = 10; //活动对象,是当进入上下文时才创建,所以 a为Undefined
alert(a);
}
b(1, 2); //
function a() {
alert(this);
}
a.call(null);//[object window]
//如果第一个参数传入的对象调用者是null或者undefined的话,call方法将把全局对象(也就是window)作为this的值
OOP-ECMAScript - 深入理解Javascript的更多相关文章
- 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)
介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...
- 玩转JavaScript OOP[3]——彻底理解继承和原型链
概述 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的“类”,由于构造函数和函数的原型都是对象,所以JavaScript的“类”本质上也是对象.这一篇我们将介绍JavaScript中 ...
- OOP—ECMAScript实现详解
我们将从最基本的数据类型来分析,首先要了解的是ECMAScript用原始值( primitive values) 和对象 ( objects) 来区分实体, 因此有些文章里说的“在JavaScript ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- 深入理解JavaScript系列(10):JavaScript核心(晋级高手必读篇)
本篇是ECMA-262-3 in detail系列的一个概述(本人后续会翻译整理这些文章到本系列(第11-19章).每个章节都有一个更详细的内容链接,你可以继续读一下每个章节对应的详细内容链接进行更深 ...
- 深入理解javascript系列(4):立即调用的函数表达式
本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- 图说js中的this——深入理解javascript中this指针
没搞错吧!js写了那么多年,this还是会搞错!没搞错,javascript就是回搞错! ………… 文章来源自——周陆军的个人网站:http://zhoulujun.cn/zhoulujun/html ...
- 深入理解JavaScript系列
转自http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 深入理解JavaScript系列(1):编写高质量JavaScript代码 ...
- 深入理解javascript(一)
此段文章摘自大叔的博客: 此文的目的是书写可维护的javascript代码. 最小的全局变量: JavaScript通过函数管理作用域.在函数内部声明的变量只在这个函数内部,函数外面不可用.另一方面, ...
随机推荐
- C++ streambuf用法
class LogStreamBuf : public std::streambuf { public: // REQUIREMENTS: "len" must be >= ...
- Dynamic Prompt Table for Record Field on PeopleSoft Page
Sometimes a situation in project work arises to have a dynamic prompt table for record fields on Peo ...
- 未能正确加载“Microsoft.VisualStudio.Implementation.EditorPackage”包
未能正确加载“Microsoft.VisualStudio.Implementation.EditorPackage”包 未处理ImportCardinalityMismatchException 未 ...
- Winform下WebBrowser 编辑模式 监听键盘按键事件
最近使用 WebBrowser 做了个富文本编辑器(其实网上有很多很多).例如下面这个玩意(不要在意界面神马的) WebBrowser在编辑模式下可以有一些HTML标签的功能,改变字体大小颜色等等等. ...
- Windows7下Microsoft Office Excel 不能访问文件解决方案
1).开始--〉运行--〉cmd 2)命令提示符下面,输入mmc -32,打开32的控制台 3).文件菜单中,添加删除管理单元--〉组件服务 4).在"DCOM配置"中找到&quo ...
- 等价表达式 (codevs 1107)题解
[问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些 ...
- SQL Server 基础:Join用法
Join(麻蛋 废话不多说 有图有真相) 测试数据脚本 CREATE TABLE Atable ( S# INT, Sname ), Sage INT, Sfrom ) ) insert into ...
- ubuntu12.04和deepin12.06使用root账户登录
修改lightdm.conf登录方式, 1.首先,激活root账户, 在终端中执行 sudo passwd root 连续两次输入 密码,即使root账户的密码,注意密码并不在终端中显示 2. 切 ...
- 【转】Winform下KeyDown,KeyPress,KeyUp事件的总结
http://blog.csdn.net/xiashengwang/article/details/6777907
- Cron表达式说明
CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...