- 原型链
每一个构造函数都有自己的原型对象 原型对象也是对象 (对象都有一个__proto__
属性) 也有自己的原型对象 以此类推 形成的链式结构称之为原型链 - 对象访问原型链中成员的规则
就近原则
(对象访问成员 先看自己有没有 有则访问 没有则从原型寻找 如果原型有则访问 原型没有 就从原型的原型寻找 以此类推 直到原型链的终点null 如果都没有 属性返回undefined 方法返回程序报错)
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = new Person('人', 20);
console.log(p.gender);
console.log(p);
console.log(p.toString());
console.log(p.constructor);
console.log(p.__proto__ === Person.prototype);
console.log(p.__proto__.__proto__.constructor);
console.log(p.__proto__.__proto__ === Object.prototype);
console.log(p.__proto__.__proto__.__proto__);
var date = new Date();
console.dir(date)
console.log(date.constructor);
console.log(date.__proto__ === Date.prototype);
console.log(date.__proto__.__proto__.constructor);
console.log(date.__proto__.__proto__ === Object.prototype);
console.log(date.__proto__.__proto__.__proto__);
var arr = [10, 20, 30];
console.log(arr)
console.log(arr.constructor);
console.log(arr.__proto__ === Array.prototype);
console.log(arr.__proto__.__proto__.constructor);
console.log(arr.__proto__.__proto__ === Object.prototype);
console.log(arr.__proto__.__proto__.__proto__);
var str = '123';
console.log(str)
console.log(str.constructor);
console.log(str.__proto__ === String.prototype);
console.log(str.__proto__.__proto__.constructor);
console.log(str.__proto__.__proto__ === Object.prototype);
console.log(str.__proto__.__proto__.__proto__);
- DOM对象的原型链
- 函数也是对象类型 是一个特殊的对象 所有的函数都是由Function构造函数创建的
- 也可以通过点语法动态添加成员
function fn() {
console.log('fn函数');
}
fn.say = function () {
console.log('函数动态添加方法');
}
fn.show = '函数动态添加属性'
fn.say();
console.log(fn.show);
console.log(fn);
console.dir(fn);
console.log(fn.__proto__.constructor);
console.log(Object.__proto__.constructor);
console.log(Array.__proto__.constructor);
console.log(fn.__proto__ === Function.prototype);
console.log(fn.__proto__.__proto__.constructor);
console.log(fn.__proto__.__proto__ === Object.prototype);
console.log(fn.__proto__.__proto__.__proto__);
- 拓展
- Function构造函数创建对象 参数都是字符串 有很多个参数
- 前面所有的参数都是函数的形参
- 最后一个参数是函数体代码
function fn(a, b) {
return a + b;
}
var fn1 = function (a, b) {
return a + b;
}
var fn2 = new Function('a', 'b', 'return a+b');
var res = fn2(10, 20);
console.log(res);
- 完整的原型链
- js中所有的对象都是构造函数创建的
1.原型对象由Object构造函数创建
2.函数对象由Function构造函数创建
3.实例化对象由对应的构造函数创建 - 只要是构造函数 就有
prototype
属性指向与之对应的原型对象 - 只要是原型对象 就有
constructor
属性指向对应的构造函数 - 只要是对象 就有
__proto__
属性指向对应的构造函数的原型对象 - 函数也是对象 js中所有的函数对象都是由Function构造函数创建的