一、面向对象概论

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. Java应用架构的演化之路

    Java应用架构的演化之路 当我们架设一个系统的时候通常需要考虑到如何与其他系统交互,所以我们首先需要知道各种系统之间是如何交互的,使用何种技术实现. 1. 不同系统不同语言之间的交互 现 在我们常见 ...

  2. phpMyAdmin提示“Access denied for user 'root'@'localhost' (using password: NO)”的解决办法

    一.错误内容 在用thinkPHP登陆phpMyAdmin时遇到以下错误 #1045 - Access denied for user 'root'@'localhost' (using passwo ...

  3. JS获取网页属性包括宽、高等

    JS获取网页属性包括宽.高等. function getInfo()  { // www.jbxue.com var s = "";  s += " 网页可见区域宽:&q ...

  4. linux分区和文件系统

    linux分区主分区:最多只能有4个扩展分区:最多只能有一个 主分区+扩展分区最多4个 扩展分区不能写入数据,只能包含逻辑分区 见图示:fq.png 主分区:总共最多只能分4个扩展分区:只能有1个,也 ...

  5. 黑白棋游戏 (codevs 2743)题解

    [问题描述] 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻方 ...

  6. MapReduce实现的Join

    MapReduce Join 对两份数据data1和data2进行关键词连接是一个很通用的问题,如果数据量比较小,可以在内存中完成连接. 如果数据量比较大,在内存进行连接操会发生OOM.mapredu ...

  7. Kafka入门学习随记(二)

    ====Kafka消费者模型 参考博客:http://www.tuicool.com/articles/fI7J3m --分区消费模型 分区消费架构图 图中kafka集群有两台服务器(Server), ...

  8. oracle11g 重新配置em

    OS: ORACLE-LINUX 5.7 DB: 11.2.0.3 [oracle@b28-122 ~]$ emctl status dbconsoleOracle Enterprise Manage ...

  9. PHP 文件操作函数大全

    <?php 读取文件夹: $handler = opendir("c:\");//打开文件夹 while($dir = readdir($handler)){//遍历文件夹 ...

  10. poj 3061 Subsequence

    题目连接 http://poj.org/problem?id=3061 Subsequence Description A sequence of N positive integers (10 &l ...