昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗?

答案是Object.prototype!

Object.prototype

在第一天有提到说「JS中除了原始型别以外的一切都是物件」。

所以每条正常的[[Prototype]]串链最顶层的尾端都是内置的Object.setPrototypeOf,这个物件含有JS中各地方所用的常见工具,如toString()、hasOwnProperty()、valueOf()等等,所有正常的物件都应起源于这个Object.setPrototypeOf物件(vmwork)。

建构式与原型

在第八天时,有提到说建构式会经由new呼叫函式,建立一个新的物件:

function Foo(){

this.say =“hello”;

}

var a = new Foo();

但其实new Foo()产生一个新的物件a同时,新的物件a的内部会有[[Prototype]]连接至Foo.prototype。

等等,Foo.prototype的.prorotype是什么鬼东西?函式有自己的原型?

「每一个函式都有一个原型物件,会被自动设为透过该函式所建立的物件原型」。

也就是说prototype是当用new创建新的物件时,该新物件的[[Prototype]]。

那我们要怎么看一个物件的原型呢?可以用__proto__或Object.getPrototypeOf()。

function Foo(){

this.say =“hello”;

}

var a = new Foo();

a.__proto__;//{constructor:ƒ}

Object.getPrototypeOf(a);//{constructor:ƒ}

Object.getPrototypeOf(a)=== Foo;//false

Object.getPrototypeOf(a)=== Foo.prototype;//true

用图表来看可能会比较好理解。

好,又有一个奇怪的东西了,什么是constructor?

函式的原型物件也就是Foo.prototype会具有constructor的属性,会参照回原来的函式。

我们建立出来的新物件,其原型会被设定为建构式函式原型所参照的物件,可以透过.constructor来存取建立物件的函式以此来作类型检查。

function Foo(){

this.say =“hello”;

}

var a = new Foo();

typeof a;//“object”

a instanceof Foo;//true

a.constructor === Foo;//true

a.__proto__.constructor === Foo;//true

所以我们可以用这张图来表示。

使用原型来实现继承

函式原型是一个物件,所以在继承实有许多种复制功能的方式。

function Person(){};

Person.prototype.say =“Hi”;

function trickyMan(){};

trickyMan.prototype = { say:Person.prototype.say};

var Jason = new trickyMan();

Jason instanceof trickyMan;//true

Jason instanceof Person;//false

执行后发现没有办法把Person继承trickyMan,这只是复制而已。

如果想要真正的原型串链,也就是Jason可以是trickyMan,trickyMan可以是Person,一直到最终的Object,应该这样做:

function Person(){};

Person.prototype.say =“Hi”;

function trickyMan(){};

trickyMan.prototype = new Person();

var Jason = new trickyMan();

Jason instanceof trickyMan;//true

Jason instanceof Person;//true

要注意到的是,由于把trickyMan指定为Person的建构物件,所以trickyMan的原本的constructor没有被任何东西参考,会被弃置且删除。

我们来看一下图片(leafor)。

那么,今天就到这边,一样如果有错误及来源未附上也欢迎留言指正,那么我们明天见。

学JS的心路历程 -物件与原型(二)的更多相关文章

  1. 学JS的心路历程-物件与原型(三)

    昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...

  2. 学JS的心路历程-物件与原型(一)

    前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...

  3. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  4. 学JS的心路历程 - JS的Class

    没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...

  5. 学JS的心路历程-JS支持面向对象?(二)

    昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧! 多态polymorphism 抽象讲法解释,就是使用单一界面操作多种型态的物件 继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(o ...

  6. 学JS的心路历程-JS支持面向对象?(一)

    昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...

  7. 学JS的心路历程-for of和for in

    我们在刚入门JS时候,说到要跑出数组的每个值肯定都是这样子: var arr = [1,2,3,4,5,6]: for(let i = 0:i < arr.length:i++){ consol ...

  8. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  9. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

随机推荐

  1. JavaScript类继承, 用什么方法好

    JavaScript类继承, 用什么方法好 一个实例: 基类Car: function Car(color, year) { this.name = "car"; this.col ...

  2. Java 11 - Java String类

    Java String类 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串 创建字符串最简单的方式如下: String gree ...

  3. css实现三角形标

    .iszb{ position: absolute;top: -75px;right:-75px;text-align: center;color: red; width: 150px;height: ...

  4. day9笔记整理,记忆

    函数的使用:一 定义函数的三种形式 1.1 无参函数 1.2 有参函数 1.3 空函数二 调用函数的三种形式 2.1 语句形式    def foo():   print('from foo')    ...

  5. ubantu 与Windows 资源共享

    Linux与Windows共享文件夹之samba的安装与使用(Ubuntu为例)   作者:@gzdaijie本文为作者原创,转载请注明出处:http://www.cnblogs.com/gzdaij ...

  6. 学习笔记: js插件 —— fullPage.js (页面全屏滚动)

    fullPage.js (页面全屏滚动) 必须依赖 jquery-ui.min.js,   233K 14760个星. 以后有时间再看. API挺全 https://github.com/alvaro ...

  7. openx 添加新表和据库表和字段

    OpenX的版本是2.8.10.在数据表加完数据库之后,还不能读取和保存字段. OpenX使用scheme来 管理数据库表和字段, 修改数据库结构同时也要修改相关schema, 一个是etc/tabl ...

  8. python Requests库网络爬取IP地址归属地的自动查询

    #IP地址查询全代码import requestsurl = "http://m.ip138.com/ip.asp?ip="try: r = requests.get(url + ...

  9. springMVC数据模型model,modelmap,map,@ModelAttribute的相互关系

    结论: a.注解方法中形参为model,modelmap,map一个或几个时,他们指向的引用对象相同即他们的值相同. b.当使用@ModelAttribute注解请求参数时,springmvc自动将该 ...

  10. curl发送xml , xml和数组互转

    public function postXml($url, array $data) { // pack xml $xml = $this->arrayToXml($data); // curl ...