1.什么是原型
原型是属性也是对象
Person.prototype.Lastname = “deng”
function Person( name, age, sex) {
this.name = name;
this.sex = sex;
this. age = age;
}
var person = new Person(‘eeded’,35,‘male’);
这里的构造函数虽然没有lastname得属性,但是访问person()仍然可以有lastname="deng"是因为存在一个原型,也就是祖先。
2.原型的案例
Person.prototype.name = "sunny";
function Person() {
}
var person = new Person();
Person.prototype.name = "cherry";
函数是引用值不是原始值,堆内存储了sunny,紧接着后面修改了堆里面的值,变成了cherry。当控制台访问person.name变成了cherry。
Person.prototype.name = "sunny";
function Person() {
}
var person = new Person();
Person.prototype = {
name:‘cherry’;
}
当控制台访问person.name结果是sunny。这里有关之前写过的堆和栈的理解,如果不熟悉堆栈可以去看看上一篇文章。栈里面的Person.prototype.name先指向了堆里面的sunny,执行new Person()后,在构造函数里面会有var this = {proto: Person.prototype}。这个语句等同于proto_=Person.prototype,_proto_跟Person.prototype一样指向了sunny;Person.prototype = { name:cherry;},该语句的结果是改变了Person.prototype.name指向堆里面的值,并没有改变_proto_指向的sunny,所以结果仍然是sunny。
总结:
Person.prototype={name:“sunny”};
proto=Person.prototype ;
Person.prototype = { name:‘cherry’}
Person.prototype.name = "sunny";
function Person() {
}
Person.prototype = {
name:cherry;
}
var person = new Person();
当控制台访问person.name结果是cherry,与上面不同的是,Person.prototype = { name:‘cherry’}放在了生成对象之前,在栈里面先有Person.prototype指向了堆里面sunny,紧接着修改了里面的值。
总结:
Person.prototype={name:“sunny”};
Person.prototype = { name:‘cherry’}
proto=Person.prototype ;
3.原型链
Grand.prototype.name = "sunny";
function Grand() {
}
var grand = new Grand();
Father.prototype = grand;
function Father(){
this.name = 'xuming';
}
var father = new Father();
Son.prototype = father;
function Son(){
this.habbit="somke";
}
var son = new Son();