美文网首页
js 面向对象

js 面向对象

作者: Vector_Wan | 来源:发表于2019-08-03 11:12 被阅读0次

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

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

    参考文章

    相关文章

      网友评论

          本文标题:js 面向对象

          本文链接:https://www.haomeiwen.com/subject/tderdctx.html