1
一、定义
根据函数中声明变量的方式,函数中变量分为以下三种:
->局部变量:在函数中以var声明的变量
->实例属性:在函数中以this前缀修饰的变量
->类属性:在函数中以函数名前缀修饰的变量
二、区别
->局部变量是只能在函数里访问的变量
->实例属性是属于单个对象的,因此必须通过对象来进行访问
->类属性是属于整个类(也指函数)本身的,因此必须通过类(也指函数)来进行访问
2 new 三步
var obj = new Base();
相当于
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
构造函数一步放实例 变量相关,prototype 是类属性,放的东西有类属性性质
// call比new 更基本 call的参数为this指针;
//从call来理解更基本
3、六大继承
结合new
https://www.jianshu.com/p/c011e41cf161
a 原型链继承
SubType.prototype = new SuperType(); 原型链继承
特点:因为每个对象的 __proto__都指向构造函数的 prototype。所以每个对象继承的属性都是一样的
function SuperType(){
this.colors = ["red", "blue", "green"];
}
function SubType(){
}
//inherit from SuperType
SubType.prototype = new SuperType();
var instance1 = new SubType();
instance1.colors.push("black");
var instance2 = new SubType();
b、最重要 寄生组合式
function inheritPrototype (SuperType, SubType) {
if (typeof SuperType !== 'function' || typeof SubType !== 'function') {
throw new Error('必须传递构造函数!')
}
// 这个地方利用Object.create(Subtype.prototype)
// 非常巧妙的让Subtype.prototype对象继承自 SuperType.prototype.
// 而不是去覆盖自己.
// 特别注意:!!!!!!!!!!!!! Object.create 方法会返回一个对象 obj. obj.__proto__ = Object.create 函数接受的参数.
// 所以,任何在此代码前给 obj 设置的属性和方法,都应该在此方法执行完毕之后在执行,否则会被覆盖.
// 引用都变了,当然会时效.
SubType.prototype = Object.create(SuperType.prototype)
}
inheritPrototype(SuperType, SubType)
function SuperType (name) {
this.name = name
this.showName = function () {
console.log('from SuperType:' + this.name)
}
}
SuperType.prototype.super_protoProperty = 'SuperType原型属性'
SuperType.prototype.super_protoFunction = function () {
console.log('SuperType原型方法')
}
function SubType (name, age) {
SuperType.call(this, name)
this.age = age
this.showAge = function () {
console.log('from SubType:' + this.age)
}
}
SubType.prototype.sub_protoProperty = 'SubType原型属性'
SubType.prototype.sub_protoFunction = function () {
console.log('SunType原型方法')
}
const sub = new SubType('张三', 22)
sub.showAge()
sub.showName()
console.log(sub.super_protoProperty) // 拿不到 undefined
sub.super_protoFunction() // 方法不存在.
sub.sub_protoFunction() // 拿自己的原型没问题
console.log(sub.sub_protoProperty) // 拿自己的原型没问题
Object.create()
只看寄生组合式继承.
To thi : 我只一路去
4、闭包
我们首先知道闭包有3个特性:
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会被垃圾回收机制回收
https://blog.csdn.net/dovlie/article/details/76339244
5、let const
//先一周准备,最重要的是都要
6、Constructor
https://www.cnblogs.com/aoyo/p/5245162.html
7、let const
https://www.cnblogs.com/zhuzhenwei918/p/6131345.html
8、Object.create(null)
var obj = {};
var obj2 = Object.create(null);
console.log(obj);
console.log(obj2)