原型
- 定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
- 利用原型特点和概念,可以提取共有属性。
- 对象如何查看原型 --> 隐式属性_ _ proto _ _
- _ _ proto _ _是函数里面的隐式属性,就像一个指针,指向函数的原型(祖先),若果改变它,那么原型将会改变,对应的,继承的对象也会改变。
例题:
<script type = "text/javascript">
Person.prototype.name = 'abc';
functon Person() {
//var this = {
//
// __proto__:Person.prototype //本来__proto__是函数里面的隐式属性,其原型为Person.prototype,继承的name属性为'abc'
//}
var obj = {
name : "sunny"
}
var person = new Person();
person.__proto__ = obj; //在这里将其指向改变,此时其原型为obj,继承的name属性为'sunny'
console.log(person.name);
</script>
//sunny
例题:
<script type = "text/javascript">
Person.prototype.name = 'sunny';
functon Person() {
//var this = {__proto__:Person.prototype }
}
var person = new Person(); //已经new好了,后面再改也没用
Person.prototype = {
name : 'cherry' //再改也是在新生成的房间里面改,和刚才new的那个房间没有关系
}
console.log(person.name);
</script>
//sunny
例题:
<script type = "text/javascript">
Person.prototype.name = 'sunny';
functon Person() {
//var this = {__proto__:Person.prototype }
}
Person.prototype = {
name : 'cherry' //而后面出现的会覆盖前面的,new还没生成就变好了
}
var person = new Person(); //有new才会出现第4行//var this = {__proto__:Person.prototype }
console.log(person.name);
</script>
//cherry
-
对象如何查看对象的构造函数 --> constructor
// Person.prototype --原型
// Person.prototype={} --是祖先 -
原型的增删改查
均在原型(祖先)本身改,无法通过后代来改变祖先的属性。
原型链
通过原型连起来的链式结构,自子集至父级依次调用。
例题:
<script type = "text/javascript">
Person.prototype = {
name : "a",
sayName : function() {
console.log(this.name); //sayName里面的this指向:谁调用的这个方法,this就是指向谁
}
}
function Person() {
this.name = "b";
}
var person = new Person();
</script>
//person.sayName() -- b
//Person.prototype.sayName() -- a
例题:
<script type = "text/javascript">
Person.prototype = {
height : 100
}
function Person() {
this.eat = function() {
this.height ++; //相当于height = height + 1 ,将父级的height拿来给自己++,加完就变成自己的了,而父亲的height还是不变
}
}
var person = new Person();
</script>
-
绝大多数对象的最终都会继承自Object.prototype
- 对象的原型只能是一个object或null,但null没有原型,也没有proto属性
- 原型类属性是系统内部属性,自己加是不管用的
-
Object.create(原型)
// var obj = Object.create(原型);
var obj = {name : "sunny",age : 123};
var obj1 = Object.create(obj);
现在在控制台:
打印:obj1.name
生成:sunny
可正常计算的范围:前16位、后16位。