上海平台网站建设报/域名交易域名出售
实例化一个对象的过程发生了什么?
-
新建一个新的空对象
-
将this指向这个对象
-
将prototype上的值赋给对象
-
返回这个对象
上面是答案,我是因为遇到以下的问题发生了新的思考:
实现链式调用myCalculator(121).add(1).minus(2).multi(3).div(4)
网上其他人的答案是这样:
function myCalculator(num) {const that=this that.num = num || 0; myCalculator.prototype.add = function (num) { that.num += +num;return myCalculator.prototype };myCalculator.prototype.minus = function (num) { that.num -= +num;return myCalculator.prototype};myCalculator.prototype.multi = function (num) { that.num *= +num;return myCalculator.prototype};myCalculator.prototype.div = function (num) { that.num /= +num;return myCalculator.prototype};myCalculator.prototype.getValue=function(){return that.num}return myCalculator.prototype}
我自己实现是这样:
function caculator(a){let total=a;caculator.add=(b)=>{total+=b;return caculator}caculator.remove=(c)=>{total-=creturn caculator}caculator.multi=(d)=>{total *=dreturn caculator}caculator.div=(e)=>{total /=ereturn total}return caculator
}
由此我引发一个疑问,为什么标准答案要多加一个prototype呢?
以上两个函数可以简化成以下的问题:
function aa(){aa.zwj='bob'aa.tall = 100return aa
}
function aa(){this.zwj='bob'
}
aa.prototype.tall == 100
以上两种写法在实例化一个新对象之后是等价的结果,但是如果合并一下就会发现prototype和this上的属性消失了:
function aa(){this.zwj='bob'aa.tall = 100return aa
}
aa.prototype.weight = 98const obj = new aa()
obj.zwj //undefined
obj.tall // 100
obj.weight // undefined
按照实例化一个对象的过程撸一下就明白了:
a、首先创建一个空对象,
b、开始执行aa函数里面的代码,
c、把this指向空对象,
d、等到读取完毕aa函数里面的内容,再将prototype上面的属性赋给新对象,
e、然后return新对象
上面的流程其实执行到步骤c的时候,程序读取完毕,发现aa函数里面return了aa,导致无法return自己新创建的空对象,所以此时this和prototype的值根本获取不到。
所以作为一个构造函数,程序的最后不应该return任何东西