this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。 但是有一个总原则,那就是this指的是调用函数的那个对象。
this一般情况
在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了
因为this的取值是执行上下文环境的一部分,每次调用函数,都会产生一个新的执行上下文环境。
对象都是通过构造函数通过new
创建的
var obj = { a: 10, b: 20 };
//等价于
var obj = new Object();
obj.a = 10;
obj.b = 20;
构造函数的特点
如果构造函数的return语句返回的是对象,new命令会返回return语句指定的对象
构造函数默认返回构造后的上下文对象
构造函数中prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数
function P() {}
P.prototype.constructor === P //true
由于constructor属性定义在prototype对象上面,意味着可以被所有实例对象继承
prototype
和__proto__
的区别
JavaScript的所有对象,都有自己的继承链。
也就是说,每个对象都继承另一个对象,该对象称为“原型”(prototype)对象。
函数也是一种对象,也是属性的集合
JavaScript默认的给函数一个属性 prototype
每个函数都有一个属性叫做prototype
,这个prototype
的属性值是一个对象
默认有一个叫做constructor
的属性,指向prototype
对象所在的构造函数
和__proto__
的属性,指向构造函数的prototye
对象是由Object构造函数通过 new 创建的
每个对象都有一个隐藏的属性 __proto__
,这个属性引用了创建这个对象的函数的prototype
JavaScript默认的给实例对象一个属性__proto__
实例对象的__proto__
属性指向构造函数obj.constructor
的prototype属性
obj.constructor
继承自obj.__proto__.constructor
obj.__proto__ === Object.prototype
obj.__proto__ === obj.constructor.prototype
这里的__proto__
是隐式原型
自定义函数的__proto__
指向的就是Object.prototype
但是Object.prototype的__proto__
指向的是null
Object.prototype.__proto__ === null;
Function.prototype.__proto__ === Object.prototype;
Function.__proto__ === Function.prototype
Object.__proto__ === Function.prototype
函数是被Function构造的
JavaScript原型链和继承
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__
这条链向上找,这就是原型链
hasOwnProperty
可以判断一个属性到底是基本的还是从原型中找到的
在JavaScript中,每一个对象都有一个对应的原型对象,被称为prototype对象。 定义在原型对象上的所有属性和方法,都能被派生对象继承。这就是JavaScript继承机制
获取实例对象obj的原型对象,有三种方法
obj.__proto__
obj.constructor.prototype
Object.getPrototypeOf(obj)
相关文章推荐: