对象:对象是属性的集合,对象是函数创建的,函数又是一种对象
obj={name:'huangbin'}
<==>var obj = new Object(),obj.name='huangbin'
function f1(x,y){return x+y}
<==>var f1 = new Function('x','y','return x+y')
- 始终记住对象的__proto__指向创建它的函数的prototype
- 除了undefind,Number,String,Boolean是简单的值类型,其他的null,Object,Function都是对象
- 函数有prototype属性,它是对象,是函数属性和方法的集合
- 每个对象都有一个__proto__属性(隐式原型),它指向创建这个对象的函数的原型
- 函数也是一种对象:Object()函数是new Function()创建的,所以他的__proto__也指向Fuction.prototype

-
构造函数模式
- 构造函数:
- 不创建对象
- 直接将属性方法赋给this对象
- 没有return语句
- 构造函数每定义一个函数就实例化了一个对象,会导致不同作用域链和标识符解析
function Person(name,age){ this.name = name; this.age = age, this.sayName = function(){ console.log(this.name) } }
- 构造函数:
-
原型模式
- 可以让所有实例化的对象共享属性、方法
Person.prototype.name="huangbin"; Person.prototype.sayname = function() { alert(this.name); } var person1 = new Person(); person1.sayname();//huangbin var person2 = new Person(); alert(person1.sayname==person2.sayname)//true```
-
[[Prototype]]指针指向构造函数的原型对象,在Firefox、Safari、Chrome中有**__proto__属性可以访问它**
-
Person.prototype.constructor指向Person
-
Person.prototype.isPrototypeOf(person1)是判断某个构造函数的原型对象是不是实例对象指向的
-
Object.getPrototypeOf():是返回实例对象的指向构造函数原型的指针([[Prototype]])
-
Person.hasOwnProperty("name")是判断属性是否来自实例
-
要获取对象中可枚举的属性,可使用Object.keys(obj)方法
-
想要获得所有实例的属性,无论是否可枚举,Object.getOwnPropertyNames(obj)
-
当使用for-in获取对象枚举属性时要用hasOwnProperty来判断:判断属性是否存在当前对象中,而不是原型对象中,当在类或者构造函数中没把属性指定到this上,那么该属性就会自动挂载到原型对象上
-
ES6中的class写法会导致属性不可枚举Object.keys
-
A instanceof B: obj是否在构造函数的原型链上,A沿着_proto_、B沿着prototype如果能指向一个对象,就返回true 1.
-
关于函数中的this
var obj1={
num:4,
fn:function(){
var f=() => {
console.log(this); //object,f()定义在obj1对象中,this就指向obj1,这就是箭头函数this指向的关键
setTimeout(function() {
console.log(this);//window,非箭头函数的情况下还是要看宿主对象是谁,如果没有被对象调用,函数体中的this就绑定的window上
});
}
f();
}
}
obj1.fn();
- 关于变量提升
- 变量在生成执行上下文时,会帮其声明并赋值undefind
- 函数则会将整个函数存入内存空间
- 原型链: 访问一个对象的属性时,如果在基本属性中找不到,就会沿着_prototype_这条原型链去找