使用 Object.create 创建对象,super 关键字,class 关键字

ECMAScript 5 中引入了一个新方法:Object.create()。可以调用这个方法来创建一个新对象。新对象的原型就是调用 create 方法时传入的第一个参数:

var a = {a: 1};
// a ---> Object.prototype ---> null

var b = Object.create(a);
// b ---> a ---> Object.prototype ---> null
console.log(b.a); // 1 (继承而来)

var c = Object.create(b);
// c ---> b ---> a ---> Object.prototype ---> null

var d = Object.create(null);
// d ---> null
console.log(d.hasOwnProperty); // undefined, 因为d没有继承Object.prototype

使用 class 关键字

ECMAScript6 引入了一套新的关键字用来实现 class。使用基于类语言的开发人员会对这些结构感到熟悉,但它们是不一样的。 JavaScript 仍然是基于原型的。这些新的关键字包括 classconstructorstaticextends, 和 super.

"use strict";
class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

class Square extends Polygon {
  constructor(sideLength) {
    super(sideLength, sideLength);
  }
  get area() {
    return this.height * this.width;
  }
  set sideLength(newLength) {
    this.height = newLength;
    this.width = newLength;
  }
}

var square = new Square(2);

super 关键字用于访问父对象上的函数。

class Polygon {
  constructor(height, width) {
    this.name = ‘Polygon‘;
    this.height = height;
    this.width = width;
  }
  sayName() {
    console.log(‘Hi, I am a ‘, this.name + ‘.‘);
  }
}

class Square extends Polygon {
  constructor(length) {
    this.height; // 这里会报错, 必须要先调用 super!

    // 这里我们调用父类的构造方法并传入 length
    // 作为 Polygon‘s 的 width 和 height
    super(length, length);

    // Note: 在派生的类中, super() 必须在 ‘this‘ 之前调用
    // 如果漏掉,则会造成引用错误。
    this.name = ‘Square‘;
  }

  get area() {
    return this.height * this.width;
  }

  set area(value) {
    this.area = value;
  }
}

  

调用父类上的静态方法

你也可以用 super 调用父类的 静态方法

class Human {
  constructor() {}
  static ping() {
    return ‘ping‘;
  }
}

class Computer extends Human {
  constructor() {}
  static pingpong() {
    return super.ping() + ‘ pong‘;
  }
}
Computer.pingpong(); // ‘ping pong‘

在对象字面量中使用 super.prop

var obj1 = {
  method1() {
    console.log("method 1");
  }
}

var obj2 = {
  method2() {
   super.method1();
  }
}

Object.setPrototypeOf(obj2, obj1);
obj2.method2(); // logs "method 1"

  

 

 

时间: 2024-10-10 07:46:42

使用 Object.create 创建对象,super 关键字,class 关键字的相关文章

Object.create(null)、Object.create({})、{} 三者创建对象的区别

参考 1.先看看我们经常使用的{}创建的对象是什么样子的: var o = {a:1}; console.log(o) 从上图可以看到,新创建的对象继承了Object自身的方法,如hasOwnProperty.toString等,在新对象上可以直接使用. 2.再看看使用Object.create()创建对象: var o = Object.create(null,{ a:{ writable:true, configurable:true, value:'1' } }) console.log(

Java修饰符------>static、native和final以及super和this关键字

修饰符修饰符的作用是让被修饰的内容具备特定的功能,在程序中合理使用修饰符可以在语法和功能上实现很多需要的效果.Java 语言中的修饰符主要有 5个:static.final.native.abstract 和 synchronized.这里首先讲解 static.final 和 native 的作用. static 修饰符static 关键字的中文意思是静态的,该修饰符可以修饰成员变量,成员常量和成员方法.使用该关键字修饰的内容,在面向对象中 static 修饰的内容是隶属于类,而不是直接隶属于

javascript:利用Object.create()方法创建对象

在javascript里面,我们知道有两种常见的创建对象的方法,一种是使用对象直接量: 对象直接量是由若干值/键对组成的映射表,值/键对用逗号”,“分隔开,整个部分用花括号”{}“括起来. 例如: var empty={}; var people = { name:'kobe', age:'34' }; 另外一种方法是通过new创建对象:在new后面使用一个函数调用,这个函数也成为构造函数,通过new来初始化一个新的对象. 例如: var arr = new Array(); var date

创建对象时引用的关键字

@font-face { font-family: "Times"; }@font-face { font-family: "宋体"; }@font-face { font-family: "宋体"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "Cambria"; }p.MsoNormal, li.MsoNormal, div.

JAVA中的super和this关键字的使用

一 this关键字 this关键字可以出现在构造方法和实例方法中,不能出现在静态方法中,这是因为静态方法可以用类名来调用,这时可能还没有任何对象诞生. this主要有两种用法: 1 用在构造方法中,调用本类的其他构造方法.  格式为  this([实参列表]);   通过this调用本类的其他构造方法时,该语句必须出现在构造方法中,并且必须作为第一条语句出现. 2 代指当前对象 例如: 1 public class Person { 2 3 private String name; 4 5 pr

object.create(null) 和 {}创建对象的区别

原文 简书原文:https://www.jianshu.com/p/43ce4d7d6151 创建对象的方法 如果要创建一个空的对象,可以使用如下的三种方法 var obj1 = {}; var obj2 = Object.create(null); var obj3 = new Object(); 创建空对象的区别 要创建一个干净的空对象,应该使用Object.create(null)而不是剩下两种. 通过做Objist.create(NULL),我们显式指定NULL作为它的原型.所以它绝对没

super和this关键字

一. super关键字 super 表示使用它的类的父类.super 可用于: 调用父类的构造方法: 调用父类的方法(子类覆盖了父类的方法时): 访问父类的数据域(可以这样用但没有必要这样用). 调用父类的构造方法语法: super(); 或 super(参数列表);注意:super 语句必须是子类构造方法的第一条语句.不能在子类中使用父类构造方法名来调用父类构造方法. 父类的构造方法不被子类继承.调用父类的构造方法的唯一途径是使用 super 关键字,如果子类中没显式调用,则编译器自动将 su

用Object.create来创建对象,及其兼容性写法

function inherit(p){ if(p==null){ throw TypeError(); } if(Object.create){ return Object.create(p); } var t=typeof p; if(t!=='object'&&t!=='function'){ throw TypeError(); } function f(){}; f.prototype=p; return new f(); } function range(from,to){ v

js 中 new 与 Object.create()的区别

前言 在js中,创建对象有三种方式 {} // 对象字面量 new Object() Object.create() 1和2的区别很小,1不能传参,2可以传参. new Object() 和Object.create() 区别就比较大了 1. new关键字 new 关键字做了几件事 创建一个新对象 将新对象的原型指向构造函数的原型 执行构造函数,绑定this 返回这个对象 比如创建一个Car对象,伪代码 // new Car() var obj = new Object() obj._proto