}
return o;
}
let person1 = createPerson(“Saury”, “14”, “IT工”);
- 对象无法识别
2.构造函数模式
function Person(name, age, job){ //构造函数名字应该大写字母开头
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log("hello, ", this.name);
}
}
let person1 = new Person(“Saury”, “14”, “IT工”);
let person1 = new Person(“Saury”, “14”, “IT工”);
// false,是两个不同的对象
console.log(person1.sayName == person2.sayName);
-
将构造函数当做普通的函数使用,
Person("...");
,此时属性和方法都被添加到window
中 -
每个实例的方法都不相同,实则完成的是同样的功能,所以会造成浪费,因此可以使用以下的方式(但是该方法会导致构造函数封装性差)
function Person(name, age, job){ //构造函数名字应该大写字母开头
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName(){
console.log("hello, ", this.name);
}
3.原型模式
function Person(name, age, job){
Person.prototype.name = name;
Person.prototype.age = age;
Person.prototype.job = job;
Person.prototype.sayName = function(){
console.log(“Hello”, this.name);
}
}
let person1 = new Person(“Kirs1”, “27”, “singer1”);
let person2 = new Person(“Kirs2”, “27”, “singer2”);
//true,由于这两个实例的方法都是挂在原型上的,所以指向的是同一个方法,则相同
console.log(person1.sayName == person2.sayName);
4.组合使用构造函数和原型模式
构造函数用于定义实例属性,原型模式用于定义方法和共享的属性
?后三种不常用就不写了
5.动态构造函数模式
6.寄生构造函数模型
7.稳妥构造函数模式
1.原型链继承
function Super(){
this.supV = ‘supV’;
}
Super.prototype.getSuperValue = function(){
return this.supV;
}
function Suber(){
this.subV = ‘subV’;
}
//实现Suber继承Super
Suber.prototype = new Super();
Suber.prototype.getSuberValue = function(){
return this.subV;
}
//创建Suber的实例调用Super的方法
let oo = new Suber();
console.log(oo.getSuperValue()); //‘supV’
存在问题:
-
原型的方法会被所有实例共享,造成实例间的属性会相互影响
-
在创建子类的实例时,不能向超类型的构造函数传递参数
2.借用构造函数
在子类的构造函数内部调用父类型构造函数
function Super(name){
this.name = name;
}
function Suber(){
Super.call(this, ‘kirs’);
this.age = ‘27’;
}
let oo = new Suber();
console.log(oo.name); //‘kris’
存在问题:
-
方法都定义在构造函数中,没有办法进行函数复用。父类的方法没有被共享,造成内存浪费。
-
在超类的原型上中定义的方法,对于子类是不可见的
3.组合继承
使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样使得定义在原型上的的方法实现函数复用,又能够保证每一个实例都有自己的属性。
function Super(name){
this.name = name;
}
Super.prototype.sayName = function(){
console.log(this.name);
}
function Suber(name, age){
//继承属性
Super.call(this, name); //第二次调用Super()
this.age = age;
}
//继承实例的方法
Suber.prototype = new Super(); //第一次调用Super()
Suber.prototype.constructor = Suber;
Suber.prototype.sayAge = function(){
sonsole.log(this.age);
}
//所有实例共有属性和方法:name, sayName()
//实例私有属性和方法:age, sayAge()
存在问题:
- 组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一组在实例上,一组在SubType原型中。第一次调用super()时,会给Suber的原型上挂载name和age属性,当第二次调用时,又一次调用super(),会挂载到实例上,如下:
var a = new Suber();
console.log(Suber.prototype);
console.log(a);
4.es6的extends
(语法糖,和寄生组合继承一样)
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return ‘(’ + this.x + ', ’ + this.y + ‘)’;
}
}
class ColorPoint extends Point {
}
5.原型式继承
该方法没有严格意义上的构造函数,借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。
function object(o){
function F(){}
F.prototype = o;
return new F();
}
var person = {
name: “Nicholas”,
friends: [“Shelby”, “Court”, “Van”]
};
var anotherPerson = object(person);
anotherPerson.name = “Greg”;
anotherPerson.friends.push(“Rob”);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车
前端视频资料:
点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车
[外链图片转存中…(img-HkfiF3rX-1713141680150)]
前端视频资料: