区别一下,普通对象和函数对象。函数对象才有prototype属性。
函数对象:
function f1(){}; var f2 = function(){}; var f3 = new Function('str','console.log(str)');
普通对象:
var o3 = new f1(); var o1 = {}; var o2 =new Object();
简单的说,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。原型的作用就是继承。
原型链:
JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype。
原型对象prototype中都有个预定义的constructor属性,用来引用它的函数对象。
person.prototype. constructor === person //true Function.prototype.constructor === Function //true Object.prototype.constructor === Object //true
总结一下:
var animal = function(){}; var dog = function(){}; animal.price = 2000;// dog.prototype = animal; var tidy = new dog(); console.log(dog. price) //undefined console.log(tidy.price) // 2000
事实证明,真正起作用的不是prototype ,而是__proto__。