原型模式Prototype,constructor,__proto__详解
最近由于在找工作,又拿起《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__详解的更多相关文章
- ★ prototype、__proto__ 详解
# var Person = function(name) { this.name = name; } var p = new Person(); //new操作符的操作是 var p = {} p. ...
- prototype constructor __proto__
constructor, prototype, __proto__ 详解
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- BS模式的模型结构详解
编号:1004时间:2016年4月12日16:59:17功能:BS模式的模型结构详解 URL:http://blog.csdn.net/icerock2000/article/details/4000 ...
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- 设计模式(四)原型模式Prototype(创建型)
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- 原型模式-Prototype(Java实现)
原型模式-Prototype 通过复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象. 就像去蛋糕店买蛋糕一样. 柜台里的蛋糕都是非卖品. 只是为顾客提供一种参照. 当顾客看上某一个样式的蛋糕 ...
- 原型模式 prototype 创建型 设计模式(七)
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
随机推荐
- Android之TextView灵活使用
Android之TextView灵活使用 在项目中有无遇到过这样一种程况,例如文字"王明今年10岁了", 但是数字10是从网络返回的数据, 而你又想把这个文字写在xml中, 过往我 ...
- linux创建、进入、修改目录或者文件权限 ‘ACM’时间是什么?怎么修改?
cd code 进入code目录,mkdir test 创建test目录,看代码框都输第三行d(目录文件标识符) rwx(user可读可写可执行) rwx(group可读可写可执行) r-x(othe ...
- 广搜 poj3278 poj1426 poj3126
Catch That Cow Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Ja ...
- cxGrid 的 Sorting和Filtering的总开关
- Flask系列09--Flask中WTForms插件,及自定义验证器
一.概述 django中的forms组件非常的方便,在flask中有WTForms的组件实现的也是类似的功能, 安装这个插件 二.简单使用 文档地址https://wtforms.readthedoc ...
- 「PKUSC2018」星际穿越(倍增)
倍增好题啊! 我们我们预处理 \(f[x][i]\) 表示 \(x\) 点最左到达的端点,\(sum[x][i]\) 表示 \(x\) 点最左到达的端点时 \(f[x][i]\sim x\) 的答案, ...
- 12_python_生成器
一.生成器 python中有三种方式获取生成器 (1)通过生成器函数 (2)通过各种推导式来实现生成器 (3)通过数据的转换也可以获取生成器 1.只要函数中存在了yield,那么这个函数就是一个生 ...
- Django(ORM常用字段)
day68 参考:http://www.cnblogs.com/liwenzhou/p/8688919.html 1. Django ORM常用字段: 1. AutoField ...
- Spark踩坑——java.lang.AbstractMethodError
今天新开发的Structured streaming部署到集群时,总是报这个错: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: ...
- AWD比赛常规套路
作者:Leafer 本文属于Arctic shell原创内容计划文章,转载请注明原文地址! 比赛环境:纯净win10,最新版kali,securecrt或者WinSCP 在进入服务器后应进行的常规 ...