什么是原型
原型prototype是function对象的一个属性,打印出来他本身也是一个对象,它以对象的形式存在,是构造函数的静态属性prototype,在内存中它里面保存的是该对象的引用
function HandPhone(){}
console.log(HandPhone.prototype)
原型解决了什么问题?
提出相同的内容,写到prototype上从而减少代码冗余,降低耦合,让构造函数创建的实列对象都能够拥有共享
function HandPhone(){}
HandPhone.prototype.rom = 'hix';
HandPhone.prototype.ram = '6G';
var h1 = new HandPhone();
var h2 = new HandPhone();
console.log(h1.rom, h2.ram)
console.log(HandPhone.prototype);
实例化对象不能对构造函数的prototype进行修改
通过实列化的对象是不能对HandPhone.prototype对上的属性进行增删改的,只能查。
constructor指向构造函数本身
constructor属性是属于 构造函数.prototype的, rpototype的constructor属性指向构造函数本身,但是可以修改它的指向,因为它只是prototype对象上的一个属性,它里面保存的是构造函数的引用,所以可以修改。
function Tel() {}
function HandPhone(){}
HandPhone.prototype.rom = 'hix';
HandPhone.prototype.ram = '6G';
//可以更改构造函数的指向
HandPhone.prototype = {
constructor: Tel,
}
var h1 = new HandPhone();
var h2 = new HandPhone();
console.log(HandPhone.prototype);
原型与实列对象的关系
1、prototype使构造函数的属性,它是一个对象,构造函数.prototype的方式可以访问到原型,prototype是构造函数构造出来的实列对象的公共祖先
2、所有被该构造函数构造出的对象都可以继承原型上的属性和方法
3、当实列对象没有某个属性或方法的时候就会去prototype原型上去找
__proto__是实例才拥有的,其实就是每个实列化对象的原型的容器
当构造函数被new操作的时候,会产生this,this对象里面默认会有一个__proto__默认会有实例化对象的原型
关于构造函数、prototype、proto
构造函数通过new关键字实列化对象的时候的步骤:
1、new关键字在构造函数中隐式的创建了一个this‘空对象’,这个this对象里面默认会有实例化对象的原型存在__proto__中,并将构造函数中this的指向这个空对象
2、初始化实列对象的属性和方法
3、构造函数指向完成以后隐式的返回this对象(这里的返回值,如果你写了返回基础类型是没用,但是如果返回一个对象,那么将会覆盖隐式返回的this)
4、将实例化后的this对象赋值给全局变量进行保存,此时实列化对象已经完成实列化
function Car(){
//实例化对象隐式生成this
//this = {
// __proto__: Car.prototype
// }
}
Car.prototype.name ="benze";
var car = new Car()
console.log(car)
console.log(car.name) //能访问,自身没有就到__proto__对应的 Car.prototype中 去找
__proto__是可以更改的,它里面保存的是构造函数的prototype的引用
function Person(){}
Person.prototype.name = '张三';
//Person.prototype = {}
var p1 = {
name: '李四',
};
var person = new Person();
console.log(person.__proto__);
console.log(person.name);
person.__proto__ = p1
console.log(person.name); //person.__proto__是可以更改的
__proto__需要注意的点
1、__proto__属性是实例化以后的结果,__proto__属性是实例化对象的隐式属性,如果不通过new关键字对构造函数进行实列化,是不会存在创造实列对象this的,__proto__属性也就不存
2、__proto__是一个容器,存放实例化对象原型的容器 -》proto:构造函数.prototype
3、因为__proto__属性中保存着构造函数的prototype属性,所以构造函数.prototype是属于实例化对象的,不是属于构造函数
4、每一个实列对象都有__proto__属性
window return
return
return关键字声明将终止函数的执行并且返回一个指定的值给调用者,如果函数没写返回值默认返回undefind
window
window作为全局对象可以将属性和方法挂载到全局对象上,然后通信全局对象对属性和方法进行访问操作
return和window的区别
return可以终止函数执行,window不能;return可以返回一个指定的值,而window则是将它挂载到全局对象上
插件写法
插件模块一般程序在加载的时候就能执行,因此需要使用立即执行函数,也可以把方法放到window上,通过window.方法名执行,如果不需要立即执行的,需要通过调用方法先进行一次执行,一般插件开发都是面向对象的方式。