原型对象
1.概念:对象的原型模型对象称为原型对象,对象自己没有的属性和方法,原型对象上有的对象可以去引用
eg:
function fn (name) {
this.name=name
}
fn.prototype={age:18}//fn{prototype:{age:18}}
var fm=new fn("Alice")//fm{__proto__:{age:18},name:Alice}
console.log(fm.name)//Alice
console.log(fm.age)//取数据时对象自己没有age属性就去原型对象上找,如果原型对象没有就去原型对象的原型对象找直到null,会返回undfined,所以age为18
存数据
function fn () {
this.name="Alice"
this.age=18
}
fn.prototype.its={html}
var f1=new fn()
f1.its="css"
var f2=new fn()
f2.class="012"
console.log(f1)//{__proto:{its:html},name:"Alice",age:18,its:css}存数据时不管原型对象有没有这个属性,都会给对象自己加
console.log(f2)//{__proto:{its:html},name:"Alice",age:18, class:012}
2.构造函数的第一个字母要大写(没有规定必须大写,但是一般为了跟普通的函数区别开,要大写)
3.每一个函数都有一个属性叫length 是形参的个数(形参个数和实参个数不一定一样多)
4.每一个函数都有一个属性叫prototype==>每一个对象(引用数据)都有一个__proto__
5.如果没有为函数指定prototype属性,系统会为每一个函数内置一个空对象:{}
6.构造函数如果是系统提供的,它的prototype属性指向的对象 只能修改成员,不能把整个对象修改了(不会报错);构造函数如果是自己写的,它的prototype属性指向的对象 可以随意操作
eg:
Array.prototype={name1:"xxxx"};//不能把整个对象修改,这是错误的
Array.prototype.name="Alice"//可以通过语法糖修改对象成员的属性
7.修改一个对象的原型对象的功能,只能通过prototype或者__proto__
8.函数创建出来的对象 的原型对象不是这个函数对象==>obj.__proto__不是fn函数也不是fn.proto 它是fn.prototype
原型链
1.取数据时:
如果对象自己没有那个属性 就会去原型上访问,原型没有就去原型的原型上访问
直到null没有返回undefined 这个就是原型链。
eg
var obj = new fn()
fn.prototype
fn.__proto__
obj.__proto__
obj.__proto__ === fn.prototype
fn.__proto__.__proto__.__proto__ === null
obj.__proto__.__proto__===null
//fn.__proto__.__proto__ === 系统提供的对象
//obj.__proto__===系统提供的对象
可画图来理解原型链