一、面向对象概论

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的更多相关文章

  1. 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)

    介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...

  2. 玩转JavaScript OOP[3]——彻底理解继承和原型链

    概述 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的“类”,由于构造函数和函数的原型都是对象,所以JavaScript的“类”本质上也是对象.这一篇我们将介绍JavaScript中 ...

  3. OOP—ECMAScript实现详解

    我们将从最基本的数据类型来分析,首先要了解的是ECMAScript用原始值( primitive values) 和对象 ( objects) 来区分实体, 因此有些文章里说的“在JavaScript ...

  4. 深入理解JavaScript系列(17):面向对象编程之概论

    介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...

  5. 深入理解JavaScript系列(10):JavaScript核心(晋级高手必读篇)

    本篇是ECMA-262-3 in detail系列的一个概述(本人后续会翻译整理这些文章到本系列(第11-19章).每个章节都有一个更详细的内容链接,你可以继续读一下每个章节对应的详细内容链接进行更深 ...

  6. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  7. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  8. 图说js中的this——深入理解javascript中this指针

    没搞错吧!js写了那么多年,this还是会搞错!没搞错,javascript就是回搞错! ………… 文章来源自——周陆军的个人网站:http://zhoulujun.cn/zhoulujun/html ...

  9. 深入理解JavaScript系列

    转自http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 深入理解JavaScript系列(1):编写高质量JavaScript代码 ...

  10. 深入理解javascript(一)

    此段文章摘自大叔的博客: 此文的目的是书写可维护的javascript代码. 最小的全局变量: JavaScript通过函数管理作用域.在函数内部声明的变量只在这个函数内部,函数外面不可用.另一方面, ...

随机推荐

  1. Linux ed命令

    $ ed              <- 激活 ed 命令  a                 <- 告诉 ed 我要编辑新文件  My name is Titan. <- 输入第 ...

  2. Objective-C控制语句

    Objective-C控制语句有以下三类: 分支语句:if-else,switch 循环语句:while,do-while,for 与程序转移相关的跳转语句:break,continue,goto. ...

  3. SQL Server编程(04)基本语法

    一.定义变量 --简单赋值 declare @a int set @a=5 print @a   --使用select语句赋值 declare @user1 nvarchar(50) select @ ...

  4. phpmyadmin误删表后的恢复过程(心惊胆跳啊)

    话说今天不知道是抽风了还是失魂了,在用phpmyadmin删除测试数据时,竟然将整个表删除了: 等程序运行出错时,才出现整个表都没有了,而且之前也没有备份好!这下蛋疼了,这个可是production服 ...

  5. angularJS通过post方法下载excel文件

    最近工作中遇到,要使用angularJS的post方法来下载excel的情况.网上找到一个帖子:http://stackoverflow.com/questions/22447952/angularj ...

  6. TextView字符串波浪式跳动--第三方开源---JumpingBeans

    在github上有一个开源项目:JumpingBeans,其项目主页是:https://github.com/frakbot/JumpingBeans JumpingBeans将一个普通的Androi ...

  7. linux MTD系统解析(转)

    MTD,Memory Technology Device即内存技术设备,在Linux内核中,引入MTD层为NOR FLASH和NAND FLASH设备提供统一接口.MTD将文件系统与底层FLASH存储 ...

  8. rails使用 rake db:migrate 提示 Migrations are pending; run 'rake db:migrate RAILS_ENV=development' to resolve this issue.

    首先得特么建立数据库 : rake db:create 实际问题是没有int应该用integer http://www.rubycc.com/column/rails3.2.3/rails.htm

  9. DrawerLayout带有侧滑功能的布局类(1)

    DrawerLayout: DrawerLayout顾名思义就是一个管理布局的.使用方式可以与其它的布局类类似. DrawerLayout带有滑动的功能.只要按照drawerLayout的规定布局方式 ...

  10. PHP中使用CURL实现GET和POST请求

    转自:http://www.smsyun.com/home-index-page-id-284.html 一.什么是CURL? cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议, ...