原型
prototype
prototype 其实是function 对象的一个属性
prototype是定义构造函数熬出来的每个对象的公共祖先
function Car(){
vat this = {
__proto__:Car.prototype
}
}
let car = new Car()
因为js不想给别人修改,所以 构造函数里面的this 不是prototyoe 而是proto,在实例化之后可以在prototype来修改,proto也可以修改实例后的对象
function Car (){
var this = {
__proto__:Car.prototype={name:'Mazda'}
}
}
Car.prototype.name = 'Benz'
console.log(car.name)
实例化的对象会把原来的Car 保存在construtor 里面,这个叫构造器
function Car () {}
Car.prototype.name = 'carName'
let car = new Car()
Car.prototype.name = 'benz'
Car.prototype = {
name:'tese'
}
console.log(car.name) // benz
------------------------分析----------------------------------------------------------
首先构造函数 有一个prototype的属性,是一个引用值
car是Car的实例,实例的过程是 把Car 生成一个this,this里面有一个key为prototype,
value为Car.prototype的属性,,
return this 出去,car 赋值为一个 key为__proto__,value为Car.prototype的实例
重点: Car.prototype.name = 'benz' 改变了prototype的name值,但是并没有改变引用,所以打印
的还是同一个引用值,
Car.prototype = {
name:'tese'
} 改变了引用值,会导致Car.prototype 和原来的关联断开,虽然constructor
指向的构造函数Car 是改变了,但是不会改变实例前的引用值
prototype的会有自己的原型 在proto下保存自己construtor,一层一层的往上,那么顶端是 Object.prototype (注意不是object)
// 经典 笔试题
function Teacher() {}
Teacher.prototype.tSkill = {
name: 'java'
}
Teacher.prototype.num = 500
let teacher = new Teacher()
Student.prototype = teacher
function Student() { }
let student = new Student()
student.tSkill.build = 'build'
student.num++
console.log(student, teacher); //
// 引用值直接在 原型上修改和创建 , 基本值得 在对象上创建
原型可以更改,但是如果自己写的原型是不能读取到的,必须是js自己造的
还有就是如果是null的原型直接没有对象的方法,不存在proto
let obj = Object.create(null)
obj.num = 2
插件开发
为了不会污染全局变量,使用立即执行函数来处理
(function(){})()
(function(){})()
// 会报错 加上分号
(function(){})();
(function(){})()
//可以执行了
//但是怕忘了打,都在前面打
;(function(){})()
;(function(){})()
插件案列
; (function () {
let TComputed = function () { }
TComputed.prototype = {
mul: function (a, b) {
return a * b
},
div: function (a, b) {
return a / b
},
plus: function (a, b) {
return a + b
},
minus: function (a, b) {
return a - b
}
}
window.TComputed = TComputed
})()
let computed = new TComputed()