字面量方式:
var obj={
name: "liuyan",
}
内置构造函数创建对象:
var obj = new Object()
obj.name='liuyan'
obj.aage=18
工厂函数创建
function createObj(){
var obj = {}
obj.name = 'liu'
obj.han= function(){}
return obj
}
var obj = createObj()
自定义构建函数
function CreateObj(){ #首字母大写规范
#this指向当前实例
this.name = 'Jack'
this.age = 18
this.sayhi=function(){}
}
var obj1 = new createObj()
#函数内部不需要写return
#如果写了,return简单数据类型没有用,return复杂类型数据会覆盖构造的属性
使用构造函数创建的对象p1和p2:
p1 不等于 p2 ——>两个不同的对象
p1.sayhi 不等于p2.sayhi ——>两个不同的函数
这样会造成创建一次对象,就会有一个一摸一样的函数占用空间
每一个构造函数天生自带prototype属性,是一个对象数据类型。
创建的对象自带__proto__属性,指向所属构造函数的protype。在访问对象自己的属性时,如果没有找到,就会去__proto__上查找,从而查询所属构造函数的prototype
将公共方法属性添加到构造函数原型上,其所有对象创建后,通过自己__proto__属性指向的构造对象的prototype原型上去获取,不需要每个对象都创建相同资源。可以使用对象的操作语法向里面添加内容
//构造函数
function Person(){
}
//构造函数原型上添加sayhi函数
Person.prototype.sayhi=function(){}
//创建对象
h1=new Person()
h2=new Person()
//调用对象中的sayhi函数
h1.sayhi
console.log(h1.saihi === h2.sayhi) #true
属性:直接写在构造函数体内
方法:写在构造函数原型上
对象是Object的实例,所有的原型链都会汇集此处
函数是Function的实例
Object的prototype是顶级原型,proto__值为null
函数访问机制:
1、首先查找自己的对象成员,如果有直接使用
2、如果没有,查询__proto ,也就是自己所属的构造函数的prototype对象
3、如果还是没有,则查询所属构造函数prototype对象的__proto__,也就是Object的prototype对象
4、如果没有找到则返回null