创建对象和实现原型继承的几种方式

}

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’

存在问题

  1. 原型的方法会被所有实例共享,造成实例间的属性会相互影响

  2. 在创建子类的实例时,不能向超类型的构造函数传递参数

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’

存在问题

  1. 方法都定义在构造函数中,没有办法进行函数复用。父类的方法没有被共享,造成内存浪费。

  2. 在超类的原型上中定义的方法,对于子类是不可见的

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()

存在问题

  1. 组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一组在实例上,一组在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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车

前端视频资料:
点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车

[外链图片转存中…(img-HkfiF3rX-1713141680150)]

前端视频资料:

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值