原型
1、定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
2、利用原型的特性和概念,可以提取共有属性。
3、对象属性的增删和原型上属性增删改查。
4、对象如何查看原型。通过隐式属性__proto__
5、对象如何查看对象的构造函数。通过constructor
Object.prototype --原型
Object.prototype={} --祖先
<script type="text/javascript">
Person.prototype.name="Jane";
function Person(){
this.name="Kang"
}
var person =new Person();
console.log(person.name);//Kang
</script>
注:当自己身上有属性,原型上也有属性的时候,取近的,用自己的属性。
在原型内部自带constructor,通过constructor能找到是谁构造的自己。
const也可以被手动更改
function Person(){
}
Car.prototype={
constructor:Person
}
function Car(){
}
var car =new Car();
console.log(car.constructor);//Person(){}
Person.prototype.name="abc";
function Person(){
// var this={
// __proto__:Person.prototype
// };
}
var person=new Person();
上面的__proto__放的是原型,__proto__存的是对象的原型
var this={__proto__:Person.prototype};
这个对象不是空的,这个proto。当你访问这个对象的属性时,如果对象没有这个属性,那么就会访问proto索引,看看有没有,是一个连接的关系,把原型和自己连接到一块。
Person.prototype.name="sunny";
function Person(){
// var this={
// __proto__:Person.prototype
// };
}
var person=new Person();
Person.prototype={
name:'cherry'
}
console.log(person.name);//sunny
Person.prototype.name这种写法是在原有的基础上把值改了。改的是属性,也就是房间里面的东西。
而Person.prototype={}是把原型改了,换了新的对象。改了个房间。上面的Person.prototype与__proto__指向的是一个空间,把它返回给var person。
先new在Person.prototype={}已经晚了
Person.prototype={}时,Person.prototype空间改了,但是__proto__指向的空间不变。
执行到new的时候,才会执行
var this={__proto__:Person.prototype};
person.prototype.__proto__=Object.prototype
(原型链的终端)
原型链
1、原型链上属性的增删改查:和原型基本上是一致的。只有本人有权限,子孙是没有的
2、谁调用的方法,内部this就指向谁
绝大多数对象的最终都会继承自Object.prototype
3、Object.create(原型)
4、原型方法上的重写
function Father(){
this.num=100;
}
var father=new Father();
Son.prototype=father;
function Son(){
}
var son=new Son();
//son.num++
//father.num=100,son.num=101
son.num++是son.num=son.num+1
是先把父级的取过来再赋值+1,所以父级没有改变
-
对象自变量的原型就是Object.prototype
-
Object.create()在括号里面只能放null或者Object,其余会报错
-
undefined和null没有原型,所以也没有toString方法
-
相同的方法名字,不同的功能,叫做重写
-
document.write会隐式的调用toString方法