博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重学前端-学习笔记-JavaScript对象-类
阅读量:6215 次
发布时间:2019-06-21

本文共 2120 字,大约阅读时间需要 7 分钟。

说明

重学前端是程劭非(winter)在极客时间开的一个专栏,在此主要整理我的学习笔记。如有侵权,请联系我,谢谢。

js的原型

  • 如果所有对象都有私有字段[[prototype]],就是对象的原型
  • 读一个属性,在该对象上找不到,就会去它的原型上查找,直到原型为空或者找到为止

js提供内置函数,来访问和操纵原型

  • Object.create:根据指定的原型来创建新对象,原型可以是null
  • Object.getPropertyOf:获取对象的原型
  • Object.setPropertyOf:设置对象的原型
var cat = {    say(){        console.log("meow~");    },    jump(){        console.log("jump");    }}var tiger = Object.create(cat,  {    say:{        writable:true,        configurable:true,        enumerable:true,        value:function(){            console.log("roar!");        }    }})var anotherCat = Object.create(cat);anotherCat.say();var anotherTiger = Object.create(tiger);anotherTiger.say();复制代码

早期版本中的类与原型

(待补充)

new操作

new运算一个构造器和一组参数,实际做了这三件事

  • 以构造器的prototype属性为原型,创建新对象
  • 讲this和参数传给构造器,执行
  • 如果构造器返回的是对象,则返回,如无,就返回第一步创建的对象

new操作让函数对象在语法上跟类相似,但是,它提供了两种方式,一种是在构造器添加属性,一种是通过构造器的prototype属性添加属性

// 通过构造器function c1(){    this.p1 = 1;    this.p2 = function(){        console.log(this.p1);    }} var o1 = new c1;o1.p2();// 通过构造器的原型function c2(){}c2.prototype.p1 = 1;c2.prototype.p2 = function(){    console.log(this.p1);}var o2 = new c2;o2.p2();复制代码

用new来实现一个Object。create的不完整polyfill

Object.create = function(prototype){    var cls = function(){}    cls.prototype = prototype;    return new cls;}复制代码

这段代码创建了一个空函数作为类,并把传入的原型挂在了它的prototype,最后创建了一个它的实例,根据 new 的的行为,这将产生一个以传入的第一个参数为原型的对象。

ES6中的类

类的基本写法

class Rectangle {  constructor(height, width) {    this.height = height;    this.width = width;  }  // Getter  get area() {    return this.calcArea();  }  // Method  calcArea() {    return this.height * this.width;  }}复制代码

通过get/set来创建getter,通过括号和大括号来创建方法,数据型成员写在构造器里。

类提供了继承能力

class Animal {   constructor(name) {    this.name = name;  }    speak() {    console.log(this.name + ' makes a noise.');  }}class Dog extends Animal {  constructor(name) {    super(name); // call the super class constructor and pass in the name parameter  }  speak() {    console.log(this.name + ' barks.');  }}let d = new Dog('Mitzie');d.speak(); // Mitzie barks.复制代码

比起早期的原型模拟方式,使用 extends 关键字自动设置了 constructor,并且会自动调用父类的构造函数,这是一种更少坑的设计。

转载于:https://juejin.im/post/5d0ba47de51d454fbf540a15

你可能感兴趣的文章
js,php获取中文长度,比较简洁的方法汇总
查看>>
排查web访问慢故障
查看>>
微信支付获取不到OPENID跳转永远失败的原因 CENTOS6.5 WDCP面板
查看>>
关于inline函数
查看>>
Windows内核新手上路1——挂钩SSDT
查看>>
所有HTTP状态代码及其定义
查看>>
成功主管讲座提纲
查看>>
MySQL创建数据库设置字符编码
查看>>
数值计算---基于梯度的优化方法
查看>>
Factory Method Pattern(工厂方法模式)——莫勇鹏老师
查看>>
test
查看>>
定义一个健壮的Android Service (IntentService)类
查看>>
jeecg3.5.0-maven版本-开发环境搭建步骤-myeclipse
查看>>
耐思尼克今起开放CN域名个人注册
查看>>
CentOS 5.5下安装MySQL 5.5全过程分享
查看>>
scala第八天
查看>>
JAVA图书管理系统汇总共27个 ——下载目录
查看>>
Linux下将ISO文件安装为本地YUM源
查看>>
flash light
查看>>
PullableView
查看>>