Javascript ES6课程与ES5课程有多少不同?
我是那种需要深入了解一切的人。。。所以,我已经学习了很多课程,我开始深入到原型继承的深度。Javascript ES6课程与ES5课程有多少不同?,javascript,oop,inheritance,ecmascript-6,Javascript,Oop,Inheritance,Ecmascript 6,我是那种需要深入了解一切的人。。。所以,我已经学习了很多课程,我开始深入到原型继承的深度。 我清楚地了解它在ES5中的工作原理(每个函数都有这个特殊的原型属性,它指向它所基于的对象。这个对象有.constructor属性,它指向函数等等) 现在我们来看ES5示例: function Bunny(name) { this.name = name } Bunny.prototype.sayName = function() { console.log('Im',this.name)
我清楚地了解它在ES5中的工作原理(每个函数都有这个特殊的原型属性,它指向它所基于的对象。这个对象有.constructor属性,它指向函数等等) 现在我们来看ES5示例:
function Bunny(name) {
this.name = name
}
Bunny.prototype.sayName = function() {
console.log('Im',this.name)
}
这一点非常清楚:函数Bunny获取参数name
,该参数将被分配给一个新对象
下一行将函数添加到函数的原型中,原型将返回当前名称
现在我们来看ES6课程:
class Fox{
constructor(name){
this.name = name;
}
sayName() {
console.log('Im', this.name)
}
}
这里也有同样的东西:Constructor
这里就像我们的Bunny函数。但是福克斯的sayName
与兔子的sayName
不同。让我们创建实例:
let bunny = new Bunny('Henry');
let fox = new Fox('Jerry');
现在,检查他们的原型:
console.log(Object.getPrototypeOf(bunny))
console.log(Object.getPrototypeOf(fox))
我们得到了什么
//using repl.it - ES6
{ sayName: [Function] }
{}
为什么呢
我想这可能是因为我们直接在Bunny的原型上设置了函数sayName
。所以我把它改成这样:
function Bunny(name) {
this.name = name
//Warning - Bad practice ahead!
this.sayName = function() {
console.log('Im',this.name)
}
}
结果:
//using repl.it - ES6
{}
{}
这是有道理的,如果不是这样的话:
console.log(bunny.hasOwnProperty('sayName'))
console.log(fox.hasOwnProperty('sayName'))
也就是说,
fox
没有他身上的sayName
,两个原型都显示它有。我是不是遗漏了什么?为什么它们不同?在ES6类中,所有方法都是不可枚举的,因此当您记录ES6类实例的原型时,您会得到一些看起来像空对象的东西
请参见此示例:
const obj=new(类{method(){});
console.log(Object.getPrototypeOf(obj));//{}
log(typeof Object.getPrototypeOf(obj.method);//函数
为什么第二个示例是不好的做法?@evolutionxbox,因为它为每个实例创建了一个新函数。切勿使用console.log
检查对象。使用console.dir
。从未听过这个,听起来很有趣-为什么?啊,这就是我错过的!不错!此外,我继续将代码粘贴到babel transpiler->在ES5中获取代码。有一个for循环,它遍历构造函数中的所有属性并检查它们是否可枚举->方法不可枚举!使用.propertyEnumerable
检查它会导致错误。另外,我在fox
和fox.prototype
上都检查了.hasOwnProperty
,结果相同。但我的问题中没有提到,我的错。