当前位置:网站首页>js 构造函数 return 非空对象,其实例化的对象在原型上的差异
js 构造函数 return 非空对象,其实例化的对象在原型上的差异
2022-07-30 12:07:00 【ymzhaoUSTB】
一、构造函数
先看下构造函数的定义
ECMAScript 中的构造函数是用于创建特定类型对象的。构造函数也是函数,只是使用 new 操作符调用构造函数会执行如下操作:
(1) 在内存中创建一个新对象
(2) 这个新对象内部的 [[Prototype]] 特性被赋值为构造函数的 prototype 属性
(3) 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)
(4) 执行构造函数内部的代码(给新对象添加属性)
(5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象
二、分析
如果不清楚构造函数的定义,就没有必要看这部分了
根据定义,这里将构造函数分为两种:有无返回非空对象。具体区别在哪儿,之前从未细想过
示例1:实例在原型上的不同
function Foo(name) {
this.name = name
}
function Bar(name) {
this.age = 27
return {
name }
}
let foo = new Foo('Tom'), bar = new Bar('Tom')
console.log(foo.__proto__ === Foo.prototype) // true
console.log(bar.__proto__ === Bar.prototype) // false

上图中也可以看出,foo的原型指向Foo的原型,而bar的原型指向Object的原型
示例2
通过这个例子更明显的对比构造函数中的 this 与 return 的实例
function Foo(name) {
const _this = this
this.name = name
function test(){
console.log(this, _this)
}
return {
name: 'Tom',
test
}
}
let foo = new Foo('Anne')
console.log(foo)
foo.test()
执行 foo.test()this 打印的是foo,即,实例化时return出来的对象_this 打印的是实例化过程中创建的新对象,根据定义,该对象原型指向构造函数的原型。相比之下,前者是对象字面量,其原型指向Object的原型

原型上的区别,意味着,上例中,foo的原型也不指向 Foo的原型,原型的构造函数也并非 Foo。
因此,foo无法访问Foo的原型属性与方法:
function Foo(name) {
const _this = this
this.name = name
function test(){
return _this
}
return {
name: 'Tom',
test
}
}
let foo = new Foo('Anne'), _this = foo.test()
Foo.prototype.age = 18
Foo.prototype.func = function() {
console.log(this.name, this.age)
}
console.log(!!foo.func, !!_this.func) // false true
_this.func() // Anne 18
针对这点,可以在构造函数内手动将返回的对象原型指向构造函数的原型
如果用不上原型链的话,可以直接忽视这点
function Foo(name) {
let res = {
}
res.__proto__ = Foo.prototype
return Object.assign(res, {
name })
}
let foo = new Foo('Anne')
Foo.prototype.age = 20
console.log(foo.age) // 20
边栏推荐
- Based on MySQL database, Redis cache, MQ message middleware, ES high availability scheme of search engine parsing
- 解码Redis最易被忽视的CPU和内存占用高问题
- Manage reading notes upward
- 2022-07-29 顾宇佳 学习笔记 异常处理
- Flexible distribution parameters of mechanical system modeling and control of research and development
- 概率论的学习整理3: 概率的相关概念
- English line break
- mapbox-gl开发教程(十四):画圆技巧
- 开源出来的fuse版pfs文件系统主要就是解决缓存问题吧。nfs挂载参数带sync规避缓存问题是不是
- saltstack学习1入门基础
猜你喜欢

来n遍剑指--04. 二维数组中的查找
![[SCTF2019]Flag Shop](/img/26/20e21ec873f41f2633703216453a44.png)
[SCTF2019]Flag Shop

电脑奔溃的时候,到底发生了什么?

概率论的学习整理5:贝叶斯(bayes)法则和贝叶斯概率

概率论的学习整理3: 概率的相关概念

Reverse linked list - iterative inversion method

Verilog grammar basics HDL Bits training 08

LeetCode_236_Last Common Ancestor of a Binary Tree

Microsoft SQL server hacked, bandwidth stolen

关于香港高防IP需要关注的几个问题
随机推荐
备战金九银十!2022面试必刷大厂架构面试真题汇总+阿里七面面经+架构师简历模板分享
[BJDCTF2020]Cookie is so stable-1|SSTI注入
JD.com was brutally killed by middleware on two sides. After 30 days of learning this middleware booklet, it advanced to Ali.
【MySQL系列】-B+树索引和HASH索引有什么区别
JS事件的相关特性以及原理
Reverse linked list - iterative inversion method
Vivado安装后添加器件库
如何用Golang来手撸一个Blog - Milu.blog 开发总结
A tutorial on how to build a php environment under win
【记一个kaggle划水比赛】PetFinder.my - Pawpularity Contest 宠物预测
概率论的学习整理1: 集合和事件
C# 时间戳与时间的互相转换
京东二面痛遭中间件虐杀,30天学透这套中间件小册,挺进阿里
ModelCoder状态机:对柴油机工况判断策略进行建模
Niuke-TOP101-BM42
概率论的学习整理2:如何对随机实验的对象:“事件” 进行计数呢? 四种计数方法,不只是排列组合
刷屏了!!!
Underwater target detection method based on spatial feature selection
The use and principle of distributed current limiting reduction RRateLimiter
基于滑模控制的不确定中立型系统有限时间稳定