Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6课程与ES5课程有多少不同?_Javascript_Oop_Inheritance_Ecmascript 6 - Fatal编程技术网

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
,结果相同。但我的问题中没有提到,我的错。