在上一期内容中,我们先介绍了什么是对象、接着又介绍了对象的属性、以及属性的访问方式。本期主要是介绍如何创建一个对象。
创建一个自定义对象的方法有多种,我们今天就来一一介绍。
一、通过初始化器来创建一个简单对象
WPS宏(JSA)中通过初始化器来创建对象,它的语法是:
let 对象名称 = {
属性1:属性值1, //有效标识符
25:属性值2, //数值
属性3:属性值3,
['属性'+4]:属性值4, //可以被计算的的key名
....
属性n-1:属性值n-1,//除最后一对属性键值对外,其他的都需要以“,”隔开。
属性n:属性值n
}
这里 "对象名称" 是新对象的名称,每一个 属性i 是一个标识符(它可以是一个名称、数字或字符串字面量),并且每个 属性值i 是一个其值将被赋予 属性i 的表达式。
"对象名称" 与赋值是可选的;如果你不需要在其他地方引用对象,你就不需要将它赋给一个变量。(注意在接受一条语句的地方,你可能需要将对象字面量括在花括号里,从而避免将字面量与块语句相混淆)
若某对象是通过脚本的对象初始化器创建的,则 WPS宏(JSA) 在每次遇到包含该对象字面量的表达式时都会创建对象。同样的,在函数中的初始化器在每次函数调用时也会被创建。
二、通过对象构造函数来创建对象
要使用这种方式来创建自定义对象,我们需要分两步:
第一步:定义一个对象类型
第二步:通过new来创建该对象的实例。
function Phone(brand,model,color)
{
this.brand = brand;
this.model = model;
this.color = color;
}
上面这个函数,我们就是创建了一个名为Phone的对象类型,并在对象内部,通过this来将传入的brand,model,color三个值赋值给对象的属性
通过这个对象类型,我们可以任意创建对象了(一个对象就是对象类型的一个实例)
let iPhone = new Phone('Apple','iPhone15','Black');
let HuaWeiPhone = new Phone('华为','Mate 70','Red');
let XiaoMiPhone = new Phone('小米','小米14','ForestGreen');
在以上的实例代码中,小编通过Phone对象创建了三个Phone对象,分别是iPhone,HuaWeiPhone、XiaoMiPhone。在实际实践中,我们可以通new创建任意可同样类型的对象实例。
小知识点
一个对象的属性值可以是另外一个对象,我们在这里再定义一个对象类型:
function People(name,age,gendar)
{
this.name = name;
this.age = age;
this.gendar = gendar;
}
然后通过new 来创建三个人物Helman、Jack、LiLei。
let Helman = new People('Helman Alson','18','Female');
let Jack = new People('Jack Smith','18','Male');
let LiLei = new People('LeeLei','18','Male');
我们将之前的手机这个对象类型重写,给它增加一个新的所有者属性
function Phone(brand,model,color,owner)
{
this.brand = brand;
this.model = model;
this.color = color;
this.owner = owner;
}
我们再通过上面这个手机对象类型来创建三款手机
let iPhone250 = new Phone('iPhone','iPhone250','Green',Helman);
let HuaWei60 = new Phone('HuaWei','Mate 60 pro','Black',LiLei);
let RedMiPhone = new Phone('XiaoMi','Red Mi 90 Pro Plus','Dark Sea Blue',Jack);
接下来,我们可以通过手机来访问它的主人的名字,年龄以及性别
console.log(`iPhone250手机的主人是${iPhone250.owner.name},
今年${iPhone250.owner.age}岁了,是个${iPhone250.owner.gendar}`);
console.log(`HuaWei60手机的主人是${HuaWei60.owner.name},
今年${HuaWei60.owner.age}岁了,是个${HuaWei60.owner.gendar}`);
console.log(`RedMiPhone手机的主人是${RedMiPhone.owner.name},
今年${RedMiPhone.owner.age}岁了,是个${RedMiPhone.owner.gendar}`);
重要:你可以随时给自己创建的对象添加你自己想要给它的属性,但对于相同对象类型的其他对象的属性是不受影响的。如果想要让某个属性影响到由该对象类型生成的其他实例,则需要在对象类型中添加该属性
三、通过 Object.create 方法来创建对象
这种方式创建自定义对象是利用Object对象的create的静态方法来创建的。
Object是我们JSA语言中的初始对象。所有的对象都是直接或者间接来自于这个对象。因此我们可以通过它的create方法来创建我们的自定义对象。
它允许我们在创建对象的时候指定一个现有的原型对象。通过这个原型对象来创建新的对象,而不需要我们先定义一个对象。语法如下:
Object.create(proto)
Object.create(proto[, propertiesObject])
proto:就是我们所说的指定的已经存在的原型对象。
propertiesObject:如果该参数被指定且不为 undefined,则该传入对象可枚举的自有属性将为新创建的对象添加具有对应属性名称的属性描述符。
返回:根据指定的原型对象和属性创建的新对象。
接下来,我们来看看这两种方式如何创建新对象的。
1、Object.create(proto)这种方式创建新对象
这种方式创建的新对象,有点类似于从已有对象那里继承而来的样子。看看下方的例子:
//定义一个陆地动物,并进行初始化。
let LandAnimal = {
type: '陆地动物',//属性 类型
arms: 0,//属性,上肢数量
legs: 4,//属性,腿的数量
Introduce: function(){//方法Introduce
let str = `${this.type},有${this.arms}条手臂,${this.legs}条腿。`
return str;
},
Skill: function(){//方法Skill
let str = '跑得快';
return str;
}
}
//根据上面的原型对象,创建一个新的陆地动物。
let dog = Object.create(LandAnimal);
dog.type = '狗';
//再创建另外一个新的陆地动物。
let horse = Object.create(LandAnimal);
horse.type = '马';
console.log(dog.Introduce());
console.log(horse.Introduce());
上面示例中,由于dog和horse都是通过原型对象LandAnimal创建的,那么LandAnimal的相关属性、方法都将被新创建的两个对象所保留下来,而不用自己再去重写。不同的是,如果这两新创建的对象将原型对象的属性重新赋值后,那么新创建的对象被重写的属性只属于新对象,与原型对象无关。也不会更改原型对象的相关属性值。
2、Object.create(proto[, propertiesObject])这种方式创建新对象:该方式是类式继承。
//定义一个远古动物的原型对象类型
function AcientAnimal()
{
this.legsNumber = 4;
this.hasTail = true;
this.life = 40;
this.language = 'No Language';
}
//三个原型对象原型链上的三个方法
AcientAnimal.prototype.speak = function(words)
{
console.log(`No Language,No sence expressed by ${words}.`);
}
AcientAnimal.prototype.hunt = function(food)
{
console.log(`When hangury,knows to hunt ${food} for eating.`);
}
AcientAnimal.prototype.run = function(dis)
{
console.log(`can run very fast by speed in ${dis}`);
}
//定义一个陆地动物的子类
function LandAnimal()
{
AcientAnimal.call(this);//调用其父方法
}
//该子类型直接继承于远古动物的对象类
LandAnimal.prototype = Object.create(AcientAnimal.prototype,{
//这是对象的属性描述的基本配置,Object.defineProperty的基本格式
constructor:{
value: LandAnimal,//原型链的对象类型
enumerable: false,//属性是否可玫举
writable: true,//属性是否可写
configurable: true,//属性是否可被删除。
},
});
//接下来又定义了一个水栖动物子类
function WaterAnimal()
{
AcientAnimal.call(this);//调用其父类方法
this.legsNumber = 0;//设置腿的数量,重写属性。
this.life = 10;//设置寿命
}
//该子类型直接继承于远古动物的对象类
WaterAnimal.prototype = Object.create(AcientAnimal.prototype,{
//这是对象的属性描述的基本配置,Object.defineProperty的基本格式
constructor:{
value: WaterAnimal,
enumerable: false,
writable: true,
configurable: true,
},
});
//通过各自的原型对象类型创建新的对象
const dog = new LandAnimal();
const fish = new WaterAnimal();
console.log('dog是LanAdnimal的实例吗?',dog instanceof LandAnimal);
console.log('dog是AcientAnimal的实例吗?',dog instanceof AcientAnimal);
console.log('dog是WaterAnimal的实例吗?',dog instanceof WaterAnimal);
以上就是创建简单对象的相关知识点。