最近由于在找工作,又拿起《JavaScript高级程序设计》看了起来,从中也发现了自己确实还是有很多地方不懂,刚刚看到原型模式这里,今天终于搞懂了,当然,我也不知道自己的理解是否有错。

1、prototype

开头第一句话说,我们每创建一个函数,就会有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含由特定类型或者实例共享的属性和方法。

function fn(){};
console.log(fn.prototype);

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAAaCAIAAAAG6EYhAAAC1UlEQVR4nO2aS27CMBBAcwzgJrmDcwwuwOcaSNmVIyC27KxIHIAtUqTSJVKXPUAqdTHtYOzE9di1oc48eRFM43HhZTxxKDqGyYji0RNgmL+EhWaygoVmsoKFZrKChWaygoV+GJPpbDKdaT2PmkzXN5//CAutA9/ry3YbO4p2bPbEBv5TbNTTX7bbJ7wGEgld1k2x2BeLfVk32Lk5tvPd6dez4s/uxnK1Xq7WsaOgwSiE2WNBSgl/JqUkBTXHD9cxzSfmTgqhy7pBcbXjzbG1nxgo9OF8JY0gREWyxIPA3DyZzparNWTH18slJHRghgaklEJUfufGILrQm2OrZWV8WSz2h/M1dnT7IqARW+hebzxS5nK19tAIBzejsNDOAe6txZTZvn/AW72lCHRqyRVOgaZpOt+d8C3I+ljkYFNDDJEgQwNaaqSmSSEq6kLfe9mYSwSVcQltrviYoQ/na1k3cIxyQz/WIerFAEPhS+14KA1TFwGPdTwQv2TpcdtqKXVChH69XNJ/aBbiCq3VG13XzXcnkA9y6m0ehnlgefv+AS/Vglt9ywyhjeA41WQ37GblSq1lwSHqSmLq+ydCA0JUT7LdEVdo1PcW70dc7Y5QdRdQs7tabEBD+y13lhbXe3lgsiG5BbscpHkO7as4RrQw6gwNxfF3YMXg3r0I9VzLZoWlqDAvp19Js8thaS4jwBYHKVw3XGYECj3GGhrEVYtgtRhQC2gVVcehv+nu9wEtIzhCFdq7UAnZDPbb4jCjq5OHohxzv/s1My6hu/stCy0lm/WDSlk35vZI7ylD/WqhYt/wRqhCQ+3okdQ9hMbnKdj8nmiYu9FYlLPQsdDuCJNBFdrvAQcS+FDDL5zZGTImCz3I5thiHrUUElGhPsgVonqqr9NCpMtmjI++3Rl6bpKSiduPk2B1fqrvMjGj/nESw6SBhWaygoVmsoKFZrKi+Hx748Ytm/YFhUvSrIIqUQwAAAAASUVORK5CYII=" alt="" />

aaarticlea/png;base64,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" alt="" />

其实

其实我们创建函数就是调用构造函数Function来实现的,其原型对象就是Object(),而这里,fn的原型对象就是Object()。

2、constructor

在默认情况下,所有的原型对象都会获得一个constructor属性,这个属性包含一个指向prototype属性所在的函数指针。

这句话怎么理解呢?其实很简单,先看代码:

function Parent(name,age){
Parent.prototype.name=name;
Parent.prototype.age=age;
Parent.prototype.arr=["123","we"];
Parent.prototype.sayHi=function(){
console.log("Hi");
};
} console.log(Parent.prototype.constructor===Parent);//true

这里Parent是构造函数,Parent.prototype才是原型对象。当哦们创建了自定义构造函数之后,Parent.prototype就会默认获得constructor属性,并且Parent.prototype.construtor=Parent,而上面的代码也说明了这一点。

我也测试了一下其他函数,看了下结果:

var t= new Parent("huan",12);

console.log(Parent.constructor);//function Function

console.log(t.constructor);//function Parent()

那这里又要如何解释呢?这里先放一个疑问,后面再来解释。

3、__proto__

3

当采用构造函数创建一个实例之后,该实例内部都会有一个指针(_proto_)指向构造函数的原型对象。

即:它是连接实例和原型对象的,而不是实例和构造函数。也就是存在下面这种关系:

t.__proto__=Parent.prototype

这样我们就可以来解答上面留下的疑问了:

函数Parent,t都是自身本身没有construtor属性,这属性是从原型对象上继承下来的。

因为t的原型对象是Parent.prototype,而Parent.prototype.construtor=Parent,所以最后输出的就是Parent。

同理,Parent的原型对象是Function.prototype,而Function.prototype.construtor=Function,所以最后输出的就是Function。

ba

4、总结

Parent.prototype指向了原型对象,而Parent.prototype.construtor又指回了Parent;Parent的每一个实例都包含一个内部属性__proto__,该属性指向Parent.prototype。实例虽然不包含方法和属性,但却可以通过查找获得。

注意事项:

1、用新对象替换prototype属性,会删除默认构造函数属性。也就会破坏construtor属性的值。

2、用新对象替换prototype属性不会更新以前的实例。

具体可看下面的代码

var Foo=function Foo(){};
Foo.prototype.x=1;
var foo=new Foo(); Foo.prototype={x:2,constructor:Parent};
var foo1=new Foo(); console.log(foo.x); //
console.log(foo1.x);//
console.log(foo1.constructor===Foo);//flase
console.log(foo.constructor===Foo);//true
console.log(foo1.constructor===Parent);//true
console.log(foo.constructor===Parent);//flase

原型模式Prototype,constructor,__proto__详解的更多相关文章

  1. ★ prototype、__proto__ 详解

    # var Person = function(name) { this.name = name; } var p = new Person(); //new操作符的操作是 var p = {} p. ...

  2. prototype constructor __proto__

    constructor, prototype, __proto__ 详解

  3. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  4. BS模式的模型结构详解

    编号:1004时间:2016年4月12日16:59:17功能:BS模式的模型结构详解 URL:http://blog.csdn.net/icerock2000/article/details/4000 ...

  5. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  6. 设计模式(四)原型模式Prototype(创建型)

      设计模式(四)原型模式Prototype(创建型) 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...

  7. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  8. 原型模式-Prototype(Java实现)

    原型模式-Prototype 通过复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象. 就像去蛋糕店买蛋糕一样. 柜台里的蛋糕都是非卖品. 只是为顾客提供一种参照. 当顾客看上某一个样式的蛋糕 ...

  9. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

随机推荐

  1. Android之TextView灵活使用

    Android之TextView灵活使用 在项目中有无遇到过这样一种程况,例如文字"王明今年10岁了", 但是数字10是从网络返回的数据, 而你又想把这个文字写在xml中, 过往我 ...

  2. linux创建、进入、修改目录或者文件权限 ‘ACM’时间是什么?怎么修改?

    cd code 进入code目录,mkdir test 创建test目录,看代码框都输第三行d(目录文件标识符) rwx(user可读可写可执行) rwx(group可读可写可执行) r-x(othe ...

  3. 广搜 poj3278 poj1426 poj3126

    Catch That Cow Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Ja ...

  4. cxGrid 的 Sorting和Filtering的总开关

  5. Flask系列09--Flask中WTForms插件,及自定义验证器

    一.概述 django中的forms组件非常的方便,在flask中有WTForms的组件实现的也是类似的功能, 安装这个插件 二.简单使用 文档地址https://wtforms.readthedoc ...

  6. 「PKUSC2018」星际穿越(倍增)

    倍增好题啊! 我们我们预处理 \(f[x][i]\) 表示 \(x\) 点最左到达的端点,\(sum[x][i]\) 表示 \(x\) 点最左到达的端点时 \(f[x][i]\sim x\) 的答案, ...

  7. 12_python_生成器

    一.生成器 python中有三种方式获取生成器 (1)通过生成器函数 (2)通过各种推导式来实现生成器 (3)通过数据的转换也可以获取生成器   1.只要函数中存在了yield,那么这个函数就是一个生 ...

  8. Django(ORM常用字段)

    day68 参考:http://www.cnblogs.com/liwenzhou/p/8688919.html 1. Django ORM常用字段:             1. AutoField ...

  9. Spark踩坑——java.lang.AbstractMethodError

    今天新开发的Structured streaming部署到集群时,总是报这个错: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: ...

  10. AWD比赛常规套路

    作者:Leafer   本文属于Arctic shell原创内容计划文章,转载请注明原文地址! 比赛环境:纯净win10,最新版kali,securecrt或者WinSCP 在进入服务器后应进行的常规 ...