JavaScript基于原型的语言(prototype-based language)
- 原型(prototype):在js中每个函数都有prototype属性,“这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法”。每个实例对象拥有的是_proto_
- 原型链(prototype chain):对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有其原型,并从其中继承方法和属性,一层一层,以此类推,这样就叫原型链。(当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去_proto_里找这个属性,这个_proto_又会有自己的_proto_,于是就这样 一直找下去)
- 原型对象:是一个内部对象,应当使用 proto 访问
function doSomething(){}
doSomething.prototype.foo = "bar";
var doSomeInstancing = new doSomething();
doSomeInstancing.prop = "some value";
console.log("doSomeInstancing.prop: " + doSomeInstancing.prop);
console.log("doSomeInstancing.foo: " + doSomeInstancing.foo);
console.log("doSomething.prop: " + doSomething.prop);
console.log("doSomething.foo: " + doSomething.foo);
console.log("doSomething.prototype.prop: " + doSomething.prototype.prop);
console.log("doSomething.prototype.foo: " + doSomething.prototype.foo);
结果:
doSomeInstancing.prop: some value
doSomeInstancing.foo: bar
doSomething.prop: undefined
doSomething.foo: undefined
doSomething.prototype.prop: undefined
doSomething.prototype.foo: bar
function Person(first, last, age, gender, interests) {
// 属性与方法定义
};
var person1 = new Person('Bob', 'Smith', 32, 'male', ['music', 'skiing']);
person1 对象的原型对象:即 Person构造函数的prototype属性所指向的对象
构造函数Person()的prototype属性指向的对象的原型对象:即Object构造函数的prototype属性所指向的对象。
(注意:必须重申,原型链中的方法和属性没有被复制到其他对象——它们被访问需要通过前面所说的“原型链”的方式)
- constructor 属性
每个实例对象都会从原型中继承一个constructor属性,该属性指向了用于构造此实例对象的构造函数。
emmmm每个对象除了有指向本身的额prototype属性,并且会有指向上层的
_proto_属性看图——【大家都说看得懂(挠头.gif 我的脑壳怎么肥事
(——但是下面这张图我看得懂嘿嘿嘿!
那么_proto_指向取决于对象创建的实现方式
这篇文章来自https://www.cnblogs.com/shuiyi/p/5305435.html 感激大佬我终于不用秃头了嘻嘻!
参考:mollypages.org/tutorials/jsobj_full.jpg
https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object_prototypes
https://github.com/creeperyang/blog/issues/9