js 面向对象

2019-08-03  本文已影响0人  Vector_Wan

1. 一切事物皆对象

JavaScript 是一个面向对象语言,对于他来说一切事物皆对象。

原始值指的是没有属性或方法的值。

原始数据类型指的是拥有原始值的数据。

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 对象 , 我声明在这里 , 但我不是独立存在的!"
...

先写这么多回头用到的时候再补充语法。

参考文章

上一篇下一篇

猜你喜欢

热点阅读