原型
1.定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以継承该原型的属性和方法。原型也是对象。
/***1.定义***/
Person.prototype.name = "hehe"
Person.prototype.say = function() {
console.log('hehe')
}
function Person() {
}
var person = new Person
var person1 = new Person //継承该原型的属性和方法
2.利用原型特点和概念,可以提取共有属性。
*原型的增删改查(只能在原型的本身上进行)
// 原先:
function Car(color,owner){ //每一执行都会执行,代码藕合
this.height=1200;
this.color=color;
this.lang= 4900;
this.owner = owner;
this.name = 'bmw'
}
var car = new Car("red","lili")
var car1 = new Car('black','xuming')
// 使用原型:
Car.prototype.height=1200;
Car.prototype.lang= 4900;
Car.prototypename = 'bmw'
3.对象如何査看对象的构造函数一> constructor
(构造器,会返回对象的构造函数)–查找自己的本身的构造函数
*(虽然是系统自带的,但是我们是可以自己更改的)
更改:
Person.prototype = {
constructor: Car
}
function Car() {
}
var car = new Car
4.对象如何査看原型一>隐形属性_ proto_
*访问对象的时候如果不存在的会回顺着_ proto_的索引去找原型,相当与连接的关系,指向原型也就是链接原型的作用
*补充知识点:
用构造函数创建对象时,new的行为
用构造函数创建对象:
var obj=new 类型名(属性值,…)
new: 4件事:
- 创建一个空对象
- 让新的子对象继承构造函数的原型对象设置(自动设置新对象的__proto__属性指向构造函数的原型对象)
- 调用构造函数:
1. this->new
2. this.属性名=值: 通过强行赋值的方式,为对象添加新属性,并保存属性值 - 返回新对象的地址,保存在变量中
function Penson() {
// var this = {
// __proto__:Person.prototype //new新对象的时候发生4段式,第一,二步
// }
}
var penson = new Person()
原型链
1.如果构造原型链
Grand.prototype.__proto__ = Object.prototype(大部分对象的最终原型) ---测试Object.prototype.__proto__ = null
Grand.prototype.lastName ="Deng"
function Grand(){
}
var grand = new Grand();
Father.prototype=grand
function Father(){
}
var father= new Father();
Son.prototype=father
function Son(){
}
var son= new Son();
这样一层层的向上查询的过程就是原型链
原型加原型,把原型连成链的,访问的顺序依照链的顺序,像作用链一样的访问顺序,可近的来的过程
2.原型链上属性的增删改查
(与原型一直)–通过子孙进行删除是不可能的,只有自己本身
Father.prototype=grand
function Father(){
this.num = 100
}
var father= new Father();
Son.prototype=father
function Son(){
}
var son= new Son();
son.num++
3.绝大多数对象的最终都会继承自Object.prototype —null
因为4,在自己创建Object.create(null) 就没有原型
4.Object.create(原型)—可以自己创建原型(必须是对象或者null)
创建对象并且原型自己指定
var obj = {name:"sunny",age:123}
var obj1=Object.create(obj)
5.那 Object.prototype 的原型呢?
Object.prototype.__proto__ === null
引用阮一峰老师的 《undefined与null的区别》 就是:
null 表示“没有对象”,即该处不应该有值
所以 Object.prototype.proto 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。
所以查找属性的时候查到 Object.prototype 就可以停止查找了。