//定义对象:两种方式一样
let obj1 = {name:'张三'};
let obj2 = new Object();
obj1.name = '张三';
let obj = { username: "wangwu", age: 23 }
let objnew = obj;
obj = { address: "北京海淀区西三环", age: 39 }
console.log("obj:", obj); //{ address: "北京海淀区西三环", age: 39 }
console.log("obj2:", objnew) //{ username: "wangwu", age: 23 }
增加或修改原型对象的属性或方法后,所有的实例或叫对象可以立即访问的到,但是创建实例后在覆盖原型除外;
栈:运行时执行方法会入栈,方法执行结束后会出栈
/*
1、QQLisi.__proto__.show() 表示该实例对象的私有属性__proto__
去访问构造它的构造函数的原型对象中的show方法。
2、QQLisi.show() 表示该实例对象首先会从自身上进行查找,
去尝试调用show()这个方法,如果没有找到,则会通过__ptoto__去访问上一层构造它的原型对象,
如果一路查找直到遇见 Object.prototype 都没发现该方法,则会停止查找。
*/
function QQUsers(QQNo_, QQAge_, QQMark_) { //构造函数
this.QQNo = QQNo_ //QQ号
this.QQAge = QQAge_ //Q龄
this.QQMark = QQMark_ //QQ标签
}
QQUsers.prototype.commonfriends = [
'骑驴看海',
'大漠上的英雄',
'坚实的果子',
'小草',
]
QQUsers.prototype.show = function () {
console.log(`QQ号:${this.QQNo},QQ龄:${this.QQAge},QQ标注:${this.QQMark}`)
console.log(`共同的好友是:${this.commonfriends}`)
}
let QQZhangSan = new QQUsers('37834522', 15, '张三') //实例对象
let QQLisi = new QQUsers('30424232', 10, '李四')
QQLisi.show()
QQLisi.__proto__.show()
// QQ号:30424232,QQ龄:10,QQ标注:李四
// 共同的好友是:骑驴看海,大漠上的英雄,坚实的果子,小草
// QQ号:undefined,QQ龄:undefined,QQ标注:undefined
// 共同的好友是:骑驴看海,大漠上的英雄,坚实的果子,小草
function Animal(name){ //Animal 构造函数
this.name=name;
}
var dog=new Animal('dog'); //dog是实例对象
console.log(dog.constructor==Animal);//true
console.log(dog instanceof Animal);//true
console.log(Animal.prototype == dog.__proto__) //true
/*
构造函数可以实例化对象,其中有一个属性叫prototype,是构造函数的原型对象,构造函数的原型对象prototype中有一个constructor构造器,这个构造器指向的就是自己所在的原型对象所在的构造函数
实例对象的原型对象(__ proto__)指向的是该构造函数的原型对象,构造函数的原型对象prototype中的方法是可以被实例对象直接访问的
原型:
实例对象中有__proto__这个属性,叫原型,也是一个对象,可以叫原型对象
这个属性是给浏览器使用的,不是标准的属性
构造函数中有prototype这个属性,也是原型对象,这个属性是给程序员使用的,是标准的属性
由于实例对象是通过构造函数来创建的,构造函数中有原型对象prototype,因此实例对象的__proto__指向了构造函数的原型对象prototype
*/
function test(){}
test.__proto__ === Function.prototype
Function.prototype.apply === test.apply
Function.prototype !== test