一、Object构造函数创建对象
let a = {}//字面量的方式创建
let a = new Object()//Object构造函数创建
let a = Object.creat(Object.prototype)
上面方式是等价的,都是创建了一个原型为Object.prototype的空对象
let b = Object.creat(null)
这是创建一个原型为null的空对象
Object.create(proto,[propertiesObject])方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。
proto 新创建对象的原型对象; propertiesObject 可选:
- configurable true
只有该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。 默认为 false- enumerable true
只有在枚举相应对象上的属性时该属性显现。 默认为 false- value 与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)。 默认为undefined.
- writable true
只有与该属性相关联的值被assignment operator改变时。 默认为 false- get 作为该属性的 getter 函数,如果没有 getter 则为undefined。函数返回值将被用作属性的值。 默认为 undefined
- set 作为属性的 setter 函数,如果没有 setter 则为undefined。函数将仅接受参数赋值给该属性的新值。默认为 undefined
let o = Object.create({}, { p: { value: 42, writable: true } }) o.p = 2 console.log(o.p);//2
举个例子这个o对象就是一个原型是{},属性p可写的一个对象;
二、构造函数创建类的概念
- 一个实例对象通过new一个类而创建出来,前面的Object可以当成一个类。
下面用构造方法创建一个Person类以及如何创建类的静态属性:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
console.log(this.name);
};
}
Person.Eat = function (o) {
console.log(`吃了${o}`);
}//创建Person类的静态方法Eat
let person1 = new Person('Nike', 29, 'teacher');
//person1就是Person的一个实例对象
- 语法糖class创建一个类:class 声明创建一个基于原型继承的具有给定名称的新类。
class Person {
//私有属性和私有方法,方法是在属性名之前,使用#表示
//只能在类的内部使用(this.#count)。如果在类的外部使用,就会报错。
#count = 0;
//ES6 明确规定,Class 内部只有静态方法,没有静态属性(在提案中)
static bar() {
console.log(`静态方法`);
}
constructor(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.eat = function () {
console.log(`${this.name}调用了eat`);
}
}
sayName() {
console.log(this.name);
}
}
类的属性除非是显式定义在其本身上(即this对象上),否则都定义在原型上。eat,sayName这两个方法是实例都可以调用,区别就是sayName在实例的prototype上