原型和原型链
创建对象的三种方式
1.对象直接量
var person = {name:孤影, age:19};
2.new一个对象
var person = new Person();
3.Object.create()
const person = Person.create({age: 19});
对象分类
1.函数对象
function F(){
console.log("定义一个构造函数");
};
2.普通对象
var obj = new Object();
普通对象可以由函数对象创造出来
function F(){
console.log("定义一个构造函数");
};
var f = new F(); //f是由函数对象F创造出来的普通对象
prototype
var obj = new Object();
console.log(obj.prototype); //undefined
function fun(){
console.log("定义一个构造函数");
};
console.log(fun.prototype); //[object Object]
obj为普通对象,普通对象没有prototype,
每一个函数对象都有一个prototype属性。
constructor
function Foo(name){
this.name = name;
};
var foo = new Foo("孤影");
console.log(Foo.prototype.constructor ===Foo);
constructor是原型对象上的属性,这个属性包含一个指向prototype属性所在的函数的指针。
proto
function fun(){
console.log("孤影最可爱");
};
//"孤影最可爱"是一个字符串对象
console.log("孤影最可爱".__proto__ === Object.prototype); //true
console.log(String.prototype.__proto__ === Object.prototype); //true
console.log("孤影最可爱".__proto__.__proto__. === Object.prototype); //true
Object.prototype.__proto__指向null,无中生有
console.log("Object.prototype.__proto__"); //null
原型链
原型对象prototype、构造函数constructor、原型指针 proto 三者之间的联系,形成了原型链
function Foo(){};
var foo = new Foo();
console.log(foo.__proto__ === Foo.prototype);
console.log(Foo.prototype.__proto__ === Object.prototype);
console.log(foo.__proto__.__proto__ === Object.prototype);
var obj = {};
console.log(obj.__proto__ === Object.prototype); //true
var o = {};
var o1 = Object.create(o);
console.log(o1.__proto__ === o);
console.log(o.__proto__ == Object.prototype);
console.log(o1.__proto__.__proto__ === o.__proto__);
console.log(o1.__proto__.__proto__ === Object.prototype);
function 特例
var A = new Function();
var a = new A();
A.prototype是个函数对象,理论上他的__proto__应该指向Function.prototype,A又是由Function创建出来的,所以他就是自己,在js里强调万物皆对象,函数对象也是对象,给他认了个祖宗,指向Object.prototype。
console.log(a.__proto__===A.prototype);
console.log(Function.prototype.__proto__ === Object.prototype);
console.log(A.prototype.__proto__ == Object.prototype);
console.log(a.__proto__.__proto__ == Object.prototype);