// to do list 创建构造函数,实例化对象,来做面向对象编程
// 创建构造函数--原型函数(原型对象)
function person(name,age,id){
this.name = name;
this.age = age;
this.id =id
// console.log(this)
}
// 创建实例化对象 学生jesica信息
var jesica = new person('jesica','18','id:99')
console.log(jesica)
//输出
//age: "18",
//id: "id:99",
//name: "jesica"
// 创建实例化对 学生ago信息
var ago = new person('ago','15','id:88')
ago.tip = 'just a little boy'
console.log(ago)
//输出
//age: "15",
//id: "id:88",
//name: "ago",
//tip: "just a little boy"
// 给构造函数person 加上all属性
person.prototype.all = 'allmssge'
console.log(jesica)
//输出
//age: "18",
//all: "allmssge",
//id: "id:99",
//name: "jesica"
console.log(ago)
//age: "15",
//all: "allmssge",
//id: "id:88",
//name: "ago",
//tip: "just a little boy"
var newman = new person('newman','10','55')
newman.laught = 'cn'
console.log(newman)
//age: "10",
//all: "allmssge",
//id: "55",
//laught: "cn",
//name: "newman"
什么是原型链。说白了,其实就是有限的实例对象和原型之间组成有限链,就是用来实现共享属性和继承的。
构造函数有一个prototype属性,这个属性是一个对象(object实例),是原型对象
【小结】
套用一句很粗暴的话,所谓原型链就是找妈的一种行为方式,就可以理解为人是人他妈生的,妖是妖他妈生的。原型链的核心其实就只有一个:属性共享和独立的控制,当你的对象实例需要独立的属性,所有做法的本质都是在对象实例里面创建属性。若不考虑太多,你大可以在Person里面直接定义你所需要独立的属性来覆盖掉原型的属性。总之,使用原型继承的时候,要对于原型中的属性要特别注意,因为他们都是牵一发而动全身的存在。现在最常用的方法是组合模式。
1、原型链
1)构造函数、原型和实例的关系
①构造函数都有一个属性prototype,这个属性是一个对象(Object的实例)
②原型对象prototype里面有一个constructor属性,该属性指向原型对象所属的构造函数
③实例对象都有一个_proto_属性,该属性也指向构造函数的原型对象,它是一个非标准属性,不可以用于编程,它是用于浏览器自己使用的
2)prototype与_proto_的关系
①prototype是构造函数的属性
②_proto_是实例对象的属性
——这两者都指向同一个对象
【总结】i)函数也是对象,对象不一定是函数;
ii)对象的本质:无序的键值对集合;键值对当中的值可以是任意数据类型的值
iii)对象就是一个容器,这个容器当中放的是(属性和方法)
3)属性搜索
①在访问对象的某个成员的时候会先在对象中找是否存在
②如果当前对象中没有就在构造函数的原型对象中找
③如果原型对象中没有找到就到原型对象的原型上找
④知道Object的原型对象的原型是null为止