内声明
我们知道new
操作符会做以下四个步骤的操作:
- 创建一个全新的对象
- 新对象内部属性
[[Prototype]]
(非正式属性__proto__
)连接到构造函数的原型 - 构造函数的
this
会绑定新的对象 - 如果函数没有返回其他对象,那么
new
表达式中的函数调用会自动返回这个新对象
eg:
function Person(name, age, job){
this.name = name;
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var obj = new Person();
obj.sayName();
es6的类中的constructor
函数负担起了之前的构造函数的功能,类中的实例属性都可以在这里初始化
class Car(){} 和 function Car的区别
1,首先类是不存在变量提升的
2,类声明中的所有代码都是自动运行在严格模式下,相当于use strict
3,类中的所有方法都是都是不可枚举的
4,类是不能直接调用的
继承:
function Rectangle(width, height){
this.width = width;
this.height = height;
}
Rectangle.prototype.getArea = function(){
return this.width * this.height;
}
function Square(length){
Rectangle.call(this, length, length);
}
Square.prototype = Object.create(Rectangle.prototype, {
constructor: {
value: Square,
enumerable: false,
writable: false,
configurable: false
}
});
var square = new Square(3);
console.log(square.getArea());
console.log(square instanceof Square);
console.log(square instanceof Rectangle);
在没有es6的继承
1,在子类调用父类构造函数
2,将父类的原型对象赋值到自己的原型链上,
3,将继承原型对象里的构造函数指向子类。
es6继承
class Rectangle{
constructor(width, height){
this.width = width;
this.height = height;
}
getArea(){
return this.width * this.height;
}
}
class Square extends Rectangle{
construct(length){
super(length, length);
}
}