原型
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 = 500let teacher = new Teacher()Student.prototype = teacherfunction 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()
