当前位置:网站首页>知其然,而知其所以然,JS 对象创建与继承
知其然,而知其所以然,JS 对象创建与继承
2022-07-17 12:32:00 【InfoQ】
对象创建
let car= {
price:100,
color:"white",
run:()=>{console.log("run fast")}
}
let car1 = {
price:100,
color:"white",
run:()=>{console.log("run fast")}
}
let car2 = {
price:200,
color:"balck",
run:()=>{console.log("run slow")}
}
let car3 = {
price:300,
color:"red",
run:()=>{console.log("broken")}
}
- 写起来麻烦,重复的代码量大;
- 不利于修改,比如当 car 对象要增删改一个属性,需要多处进行增删改;
工厂函数
function makeCar(price,color,performance){
let obj = {}
obj.price = price
obj.color= color
obj.run = ()=>{console.log(performance)}
return obj
}
let car1= makeCar("100","white","run fast")
let car2= makeCar("200","black","run slow")
let car3= makeCar("300","red","broken")
brandmakeCarfunction makeCar(price,color,performance,brand){
let obj = {}
obj.price = price
obj.color= color
obj.run = ()=>{console.log(performance)}
obj.brand = brand
return obj
}
let car4= makeCar("400","white","run fast","benz")
let car5= makeCar("500","black","run slow","audi")
let car6= makeCar("600","red","broken","tsl")
makeCarChildfunction makeCarChild (price,color,performance,brand){
let obj = {}
obj.price = price
obj.color= color
obj.run = ()=>{console.log(performance)}
obj.brand = brand
return obj
}
let car4= makeCarChild("400","white","run fast","benz")
let car5= makeCarChild("500","black","run slow","audi")
let car6= makeCarChild("600","red","broken","tsl")

构造函数
function MakeCar(price,color,performance){
this.price = price
this.color= color
this.run = ()=>{console.log(performance)}
}
function MakeCarChild(brand,...args){
MakeCar.call(this,...args)
this.brand = brand
}
let car4= new MakeCarChild("benz","400","white","run fast")
let car5= new MakeCarChild("audi","500","black","run slow")
let car6= new MakeCarChild("tsl","600","red","broken")
- 函数名首字母通常大写;
- 创建对象的时候要用到 new 关键字(new 的过程这里不再赘述了,之前文章有);
- 函数没有 return,而是通过 this 绑定来实现寻找属性的;
构造+原型
car4.__proto__===MakeCarChild.prototype // true
MakeCarChild.prototype.__proto__ === MakeCar.prototype // false
MakeCarChild.__proto__ === MakeCar.prototype // false
MakeCarChildMakeCar
function MakeCar(price,color,performance){
this.price = price
this.color= color
this.run = ()=>{console.log(performance)}
}
function MakeCarChild(brand,...args){
MakeCar.call(this,...args)
this.brand = brand
}
MakeCarChild.prototype = new MakeCar() // 原型继承父类的构造器
MakeCarChild.prototype.constructor = MakeCarChild // 重置 constructor
let car4= new MakeCarChild("benz","400","white","run fast")
car4.__proto__ === MakeCarChild.prototype // true
MakeCarChild.prototype.__proto__ === MakeCar.prototype // true
工厂+构造+原型

function object(o) { // 工厂函数
function F() {}
F.prototype = o;
return new F(); // new 一个空的函数,所占内存很小
}
function inherit(child, parent) { // 原型继承
var prototype = object(parent.prototype)
prototype.constructor = child
child.prototype = prototype
}
function MakeCar(price,color,performance){
this.price = price
this.color= color
this.run = ()=>{console.log(performance)}
}
function MakeCarChild(brand,...args){ // 构造函数
MakeCar.call(this,...args)
this.brand = brand
}
inherit(MakeCarChild,MakeCar)
let car4= new MakeCarChild("benz","400","white","run fast")
car4.__proto__ === MakeCarChild.prototype // true
MakeCarChild.prototype.__proto__ === MakeCar.prototype // true
ES6 class
class MakeCar {
constructor(price,color,performance){
this.price = price
this.color= color
this.performance=performance
}
run(){
console.log(console.log(this.performance))
}
}
class MakeCarChild extends MakeCar{
constructor(brand,...args){
super(brand,...args);
this.brand= brand;
}
}
let car4= new MakeCarChild("benz","400","white","run fast")
car4.__proto__ === MakeCarChild.prototype // true
MakeCarChild.prototype.__proto__ === MakeCar.prototype // true
对象与函数

let obj = {}Objectlet obj = {}
obj.__proto__ === Object.prototype // true
- 所有的构造函数的隐式原型都等于 Function 的显示原型,函数都是由 Function 构造而来,Object 构造函数也不例外;
- 所有构造函数的显示原型的隐式原型,都等于 Object 的显示原型,Function 也不例外;
// 1.
Object.__proto__ === Function.prototype // true
// 2.
Function.prototype.__proto__ === Object.prototype // true

小结
边栏推荐
- HCIA 复习作答 2022.7.6
- How to save and exit VIM
- 【牛客刷题】/*C语言实现字符串左旋*/
- 2022年浙江省中职组“网络空间安全”编码信息获取解析(完整版)
- C语言结构体实现简易通讯录
- ash: /etc/apt/sources. List: insufficient permissions
- opencv 画黑色矩形,并写上序号
- Koa2 connects to MySQL database to realize the operation of adding, deleting, changing and querying
- QT学习日记17——Qt数据库
- R语言使用原生包(基础导入包、graphics)中的plot函数可视化散点图(scatter plot)
猜你喜欢

HCIA RIP实验 7.11

上學=掙錢?無需繳納學費的神仙院校!

如何解决谷歌浏览器解决跨域访问的问题

Excel表格转换为Word表格,并且保留Excel表格中公式不发生变化

2022 Hunan secondary vocational group "Cyberspace Security" packet analysis infiltration Pacpng parsing (super detailed)

C语言之构造类型细讲

Good news

2022年湖南省中职组“网络空间安全”数据包分析infiltration.pacpng解析(超详细)

HCIP 第一天 7.15

yarn(cdh)中的虚拟cpu和内存
随机推荐
喜报
idea展示服务端口--service
中科磐云——网络空间安全抓包题目 B.pcap
作业:输入1-100的奇数
机械臂速成小指南(十三):关节空间轨迹规划
【微信小程序】使出千手浮图—回滚式
Software engineering - ranking of majors in Chinese Universities of Software Science
【MySQL】MySQL的增删查改(进阶)
2022年湖南省中职组“网络空间安全”赛题解析(超详细)
String类型函数传递问题
opencv 画黑色矩形,并写上序号
Secondary vocational network security - (2022 network security NC batch connection script) free script oh~~~
二叉树的概念及三种遍历方法(C语言)
微信小程序云开发 1 - 数据库
【CSP-J 2021】总结
ash: /etc/apt/sources.list: 权限不够
Go to school = earn money? Immortal college without paying tuition fees!
YARN环境中应用程序JAR包冲突问题的分析及解决
[Download] take you to use FRP to achieve intranet penetration detailed tutorial!
Data Lake (XII): integration of spark3.1.2 and iceberg0.12.1