js 面向对象
1. 一切事物皆对象
JavaScript 是一个面向对象语言,对于他来说一切事物皆对象。
- 布尔是对象(如果用 new 关键词定义)
- 数字是对象(如果用 new 关键词定义)
- 字符串是对象(如果用 new 关键词定义)
- 日期永远都是对象
- 算术永远都是对象
- 正则表达式永远都是对象
- 数组永远都是对象
- 函数永远都是对象
- 对象永远都是对象
原始值指的是没有属性或方法的值。
原始数据类型指的是拥有原始值的数据。
JavaScript 定义了 5 种原始数据类型:
string
number
boolean
null
undefined
原始值是一成不变的(它们是硬编码的,因此不能改变)。
2. 原型与原型链
我们知道 C++ 与 Java 等高级语言是通过类的方式来实现面向对象编程的,而 js 与他们不同,是通过一种叫做 原型 的方式来实现的。
我们先来讨论一下讨论 基于类的(class-based)面向对象和 基于原型的 (prototype-based) 面向对象这两种方式在构造客观世界的方式上的差别。
在基于类的面向对象方式中,对象(object)依靠 类(class)来产生。而在基于原型的面向对象方式中,对象(object)则是依靠 构造器(constructor)利用 原型(prototype)构造出来的。
举个客观世界的例子来说明二种方式认知的差异。例如工厂造一辆车,一方面,工人必须参照一张工程图纸,设计规定这辆车应该如何制造。这里的工程图纸就好比是语言中的 类 (class),而车就是按照这个 类(class)制造出来的;
另一方面,工人和机器 ( 相当于 constructor) 利用各种零部件如发动机,轮胎,方向盘 ( 相当于 prototype 的各个属性 ) 将汽车构造出来。
类式面向对象语言比如 Java,为了弥补无法使用面向过程语言中全局函数和变量的不便,允许在类中声明静态 (static) 属性和静态方法。而实际上,客观世界不存在所谓静态概念,因为一切事物皆对象!而在原型式面向对象语言中,除内建对象 (build-in object) 外,不允许全局对象、方法或者属性的存在,也没有静态概念。所有语言元素 (primitive) 必须依赖对象存在。但由于动态语言的特点,语言元素所依赖的对象是随着运行时 (runtime) 上下文 (context) 变化而变化的(这一点与 python 很像, 比如鸭子类型),具体体现在 this 指针的变化。正是这种特点更贴近 “万物皆有所属,宇宙乃万物生存之根本”的自然观点。在下面的例子中 浏览器提供的对象 window 对象可以看成是‘宇宙’。实际上我们定义的全局变量就是在 window 对象中保存的。
var str = "我是一个 String 对象 , 我声明在这里 , 但我不是独立存在的!"
var obj = { des: "我是一个 Object 对象 , 我声明在这里,我也不是独立存在的。" };
var fun = function() { console.log( "我是一个Function 对象!谁调用我,我属于谁:", this ); };
obj.fun = fun;
console.log( this === window ); // 打印 true
console.log( window.str === str ); // 打印 true
console.log( window.obj === obj ); // 打印 true
console.log( window.fun === fun ); // 打印 true
fun(); // 打印 我是一个 Function 对象!谁调用我,我属于谁:window
obj.fun(); // 打印 我是一个 Function 对象!谁调用我,我属于谁:obj
fun.apply(str); // 打印我是一个 Function 对象!谁调用我,我属于谁:str
我们可以在 consol 中查看 window :可以看到下面这个 感觉像 JSON 的写法 的输出,这里面有一个 str
Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
QBMiniVideo:ƒ QBMiniVideo()
alert:ƒ alert()
applicationCache:ApplicationCache {status: 0, onchecking: null, onerror: null, onnoupdate: null, ondownloading: null, …}
atob:ƒ atob()
blur:ƒ ()
...
str:"我是一个 String 对象 , 我声明在这里 , 但我不是独立存在的!"
...
先写这么多回头用到的时候再补充语法。