JavaScript如何实现一个类(顶层源码)
本文主要通过es5的源码分析JavaScript如何实现一个类
前置知识
立即执行函数
什么是立即执行函数?JS立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行。
(function t(){
console.log("立即执行")
}())
此函数会在定义时候立即调用
prototype
JavaScript的原型链,prototype表示显示原型,__proto__表示隐式原型
,隐式原型等于显示原型。
typescript类的源码
class Person {
public name: string = "noname"
public age: number = 0
public phone: string = "11111"
constructor(name_: string, age_: number, phone_: string) {//无参构造器
this.name = name_;
this.age = age_;
this.phone = phone_;
}
public doEat(who: string, address: string): void {
console.log(`${this.name}和${who}吃饭,在${address}吃饭`);
}
public doStep() {
}
}
let zhangSanPerson = new Person("zhangSan", 23, "134123123");
zhangSanPerson.doEat("李四", "王府井")
console.log(zhangSanPerson)
ts编译后的es5源码
var Person = /** @class */function () {
function Person(name_, age_, phone_) {
this.name = "noname"; //赋初值为noname
this.age = 0;
this.phone = "11111";
this.name = name_;
this.age = age_;
this.phone = phone_;
}
Person.prototype.doEat = function (who, address) {
console.log(this.name + "\u548C" + who + "\u5403\u996D,\u5728" + address + "\u5403\u996D");
};
Person.prototype.doStep = function () {};
return Person;
}();
var zhangSanPerson = new Person("zhangSan", 23, "134123123");
zhangSanPerson.doEat("李四", "王府井");
console.log(zhangSanPerson);
分析:
js类:class xxx{}
es5类:var xxx= function(){}
js构造器以及赋初值:public name: string = "noname"
public age: number = 0
public phone: string = "11111"
constructor(name_: string, age_: number, phone_: string) {//无参构造器
this.name = name_;
this.age = age_;
this.phone = phone_;
}
es5:function Person(name_, age_, phone_) {
this.name = "noname"; //赋初值为noname
this.age = 0;
this.phone = "11111";
this.name = name_;
this.age = age_;
this.phone = phone_;
}
js方法: public doEat(who: string, address: string): void {
console.log(`${this.name}和${who}吃饭,在${address}吃饭`);
}
public doStep() {
}
es5方法:Person.prototype.doEat = function (who, address) {
console.log(this.name + "\u548C" + who + "\u5403\u996D,\u5728" + address + "\u5403\u996D");
};
Person.prototype.doStep = function () {};