在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1、类类是用于创建对象的模板。 function Point(x, y) { this.x = x; this.y = y; } Point.prototype.toString = function () { return '(' + this.x + ', ' + this.y + ')'; }; var p = new Point(1, 1);
如下: class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } } 类的数据类型就是函数,它本身就是指向函数的构造函数: // ES5 函数声明 function Point() { //... } // ES6 类声明 class Point { //.... constructor() { } } typeof Point // "function" Point === Point.prototype.constructor // true 在类里面定义的方法是挂到 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } } Point.prototype = { //.... toString() } var p = new Point(1, 1); p.toString() // (1,1) 类的另一种定义方式类表达式 // 未命名/匿名类 let Point = class { constructor(x, y) { this.x = x; this.y = y; } }; Point.name // Point 函数声明和类声明有个重要区别,函数声明会提升,类声明不会提升。 > let p = new Point(); // 被提升不会报错 > function Point() {} > > let p = new Point(); // 报错,ReferenceError > class Point {} > 1.1 constructor()
一个类必须有
class Point { } // 自动添加 class Point { constructor() {} } 1.2 getter和setter与 class User { constructor(name) { this.name = name; } get name() { return this.name; } set name(value) { this.name = value; } } 1.3 this类的方法内部的 class User { constructor(name) { this.name = name; } printName(){ console.log('Name is ' + this.name) } } const user = new User('jack') user.printName() // Name is jack const { printName } = user; printName() // 报错 Cannot read properties of undefined (reading 'name') 如果要单独调用又不报错,一种方法可以在构造方法里调用 class User { constructor(name) { this.name = name; this.printName = this.printName.bind(this); } printName(){ console.log('Name is ' + this.name) } } const user = new User('jack') const { printName } = user; printName() // Name is jack
另外可以使用箭头函数,因为箭头函数内部的this总是指向定义时所在的对象。 class User { constructor(name) { this.name = name; } printName = () => { console.log('Name is ' + this.name) } } const user = new User('jack') const { printName } = user; printName() // Name is jack 1.4 静态属性静态属性指的是类本身的属性,而不是定义在实例对象 class User { } User.prop = 1; User.prop // 1 1.5 静态方法可以在类里面定义静态方法,该方法不会被对象实例继承,而是直接通过类来调用。 静态方法里使用 class Utils { static printInfo() { this.info(); } static info() { console.log('hello'); } } Utils.printInfo() // hello 关于方法的调用范围限制,比如:私有公有, 2、继承
继承时,子类必须在 class Point3D extends Point { constructor(x, y, z) { super(x, y); // 调用父类的constructor(x, y) this.z = z; } toString() { return super.toString() + ' ' + this.z ; // 调用父类的toString() } } 父类的静态方法,也会被子类继承 class Parent { static info() { console.log('hello world'); } } class Child extends Parent { } Child.info() // hello world 2.1 super关键字在子类的构造函数必须执行一次 class Parent {} class Child extends Parent { constructor() { super(); } } 在子类普通方法中通过 class Parent { constructor() { this.x = 1; this.y = 10 } printParent() { console.log(this.y); } print() { console.log(this.x); } } class Child extends Parent { constructor() { super(); this.x = 2; } m() { super.print(); } } let c = new Child(); c.printParent() // 10 c.m() // 2 2.2 _proto_和prototype初学
下图是一些拥有prototype内置对象: 根据上面描述,看下面代码 var obj = {} // 等同于 var obj = new Object() // obj.__proto__指向Object构造函数的prototype obj.__proto__ === Object.prototype // true // obj.toString 调用方法从Object.prototype继承 obj.toString === obj.__proto__.toString // true // 数组 var arr = [] arr.__proto__ === Array.prototype // true 对于 function Foo(){} var f = new Foo(); f.__proto__ === Foo.prototype // true Foo.__proto__ === Function.prototype // true 2.3 继承中的__proto__类作为构造函数的语法糖,也会同时有
class Parent { } class Child extends Parent { } Child.__proto__ === Parent // true Child.prototype.__proto__ === Parent.prototype // true 2.4 继承实例中的__proto__子类实例的 子类实例的 class Parent { } class Child extends Parent { } var p = new Parent(); var c = new Child(); c.__proto__ === p.__proto__ // false c.__proto__ === Child.prototype // true c.__proto__.__proto__ === p.__proto__ // true 3、小结到此这篇关于前端 |
请发表评论