javascript - JavaScript 的原型继承是如何工作的?
问题描述
我想知道 JavaScript 的原型继承是如何工作的。当我们使用 new 关键字创建对象时,对象的 __proto__
设置为Constructor_Function.prototype
.
但我不明白为什么我会得到这个输出。
我的代码:
function SimpleFunction(){}
let obj = new SimpleFunction();
console.dir(obj);
输出 :
SimpleFunction {}
[[Prototype]]: Object
constructor: ƒ SimpleFunction()
[[Prototype]]: Object
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
__proto__: Object
constructor: ƒ SimpleFunction()
[[Prototype]]: Object
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
__proto__: Object
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
__proto__: null
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
当我尝试这个时:
obj.__proto__.__proto__.__proto__;
我有 :
null
所以我不明白为什么输出中有三个以上的原型对象。
解决方案
所以我不明白为什么输出中有三个以上的原型对象。
这是因为SimpleFunction()
构造函数是派生的源对象(函数也是具有原型的对象)。由于SimpleFunction()
是用户定义的,它必须像其他所有对象一样从 Object 对象继承。因此,您拥有函数对象及其原型 Object 对象,然后您拥有obj
从构造函数派生的具有自己的 Object 对象原型。
如果有兴趣,这里是描述这个过程的规范
不,[[Prototype]] 和__proto__
不是一回事。如果您查看日志,您将看到名为 的 setter 和 getter __proto__
。所以__proto__
实际上是 [[Prototype]] 的访问器属性,而 [[Prototype]] 反映了作为原型的实际对象。
推荐阅读
- java - 使用 Jena API 检索 Ontology IRI
- c# - TCPClient 和 TCPListener 只监听不发送
- r - 在 ggplot 中从数据帧创建多个图,标题对应于行名
- sql - 具有关联条件的分组方式
- python-3.x - Pip3 安装到错误的文件夹中
- python - Seaborn 子图为 n 个最高的条形图提供不同的颜色
- git - 从 github repo 拉取时如何选择性地不合并
- python - 我只需要在屏幕的一小块区域中检测颜色(红色)(我可以找出坐标)。(Python)
- python - 导入 python 包,嵌套包......上升,遍历等......似乎不起作用 - 我做错了什么?
- amazon-s3 - boto3 S3Transfer 抛出错误 AttributeError: 'ResourceMeta' 对象没有属性 'events'