关于JS的Object对象

1.对象的创建

var object = new Object();
对象创建完成后可随时为对象添加property,function。如:

object.name = "fiona";
object.change = function () {
    console.log("change what?");
}

2.对象默认的属性和方法

对象创建后自带的属性,方法:
a> constructor 构造函数的指向,指向一个function。
b> hasOwnProperty(propertyName) 是否包含某个属性,入参为string
c> isPropertypeOf() 用于类型判断,是否为某种类型的实例,入参为object
d>prototype 指向原型对象,后面会详细说明
e> _proto_ 指向对象原型,可以理解为一个对象实例初始化时所用的模版

对比prototype 和_proto_:

首先prototype是对象类型的属性,不是实例对象的属性。_proto_是类型和实例都有的属性。
现在定义一个Dog类

function Dog () {
    this.name = "";
}

var dog = new Dog();

这个时候,dog初始化的时候,是有一个自定义属性,name为空串。如果有需求时每一个Dog实例产生时都有一些相同的模版值,除了在构造函数中声明,类似name属性。还可以为Dog声明一个对象模版,定义自定义属性。就可以使用prototype定义:

Dog.prototype = {
    sex : 'femail'
}

此时如果重新new一个dog1,dog1就会为Dog {name: "", sex: "femail"}两个属性,一个属性来自于构造函数,一个属性来自于构造模版。
打印dog1._proto结果为:{sex: "femail"},表示dog1的那些属性来自于Dog的模版。
此时中途改变一下dog1的sex 属性
dog1.sex = "mail"
打印dog1._proto
结果为:{sex: "mail"},所以实例对象的_proto_记录哪些属性来自于原型模版。

再定义一个foolDog继承Dog,并定义foolDog的原型模版

function foolDog() {
    Dog.call(this);
    this.type = "哈士奇"
}

foolDog.prototype = {
    color :  "whiteAndBlack",
    IQNumber : 10
}

var hashiqi = new foolDog()

此时hashiqi的属性有
{name: "", type: "哈士奇",color : "whiteAndBlack", IQNumber : 10 }
可以看出,foolDog继承了Dog的构造函数中的属性name,但没有继承prototype中定义的属性。因此prototype可以用于定义对象特有的原型属性,并且不被子对象继承。new出来的实例可以查看_proto_属性查看哪些属性来自于原型模版。

再对比由Dog类型new出的dog实例,和最初样例中的Object生成的实例o,dog也可以是 o.name = "",o.sex = 'femail" 表示的含义。个人感觉在js中类的概念是较弱的,都是为了便于区分理解,由object衍生出来的。

你可能感兴趣的:(关于JS的Object对象)