1.定义:
祖先作用,属性方法可以被执行
构造函数:大驼峰式
生产对象new
Person.prototype原型
Person在刚刚出生的时候,Person.prototype={}就定义好了
是一个空对象,是Person构造函数的对象的公共祖先,可以继承祖先的属性
person这个对象可以继承他的祖先Person.prototype的属性,但是直接输入person,不会显示出来。
原型是Person制造出的所有对象的共有祖先:
对象自己设置的属性,先访问自己的,没有了再找原型的:
2.利用原型的特点和概念,可以提取共有属性
3.原型的增删改查
访问:如果对象没有,会通过原型找
修改:不能通过对象对原型改
这样相当于给对象加了一个属性
手动改原型:
增加:一定是通过Person.prototype.属性 增加属性
删除:电脑是傻子,没有的属性也能删返回true
原型的属性可以换一种方式写:
4.对象如何查看对象的构造函数 => constructor
car的constructor属性从哪来的?因为自己没定义,所以是继承来的,看原型的属性里有什么:
浅粉色字体是系统自己写的,隐式的,写的就是car的构造函数function Car()。
car的constructor就是他本身Car,可以改变.通过:Car.prototype={constructor:Person}(认贼作父)
5.对象如何查看原型——>隐式属性__proto__
每个对象都有一个__prto__属性,指向它的原型
new一个对象后,就会var this={},其实并不是空对象,里面有__prto__:构造函数名.prototype
__proto__的作用就是,当person里没有的属性,就通过__proto__在原型里找,起一个连接的作用
可以修改原型:
person.proto=obj了,person.name就会通过person.__proto__找到obj的属性name输出,不会再找Person.prototype里面的name "abc"了
Person.prototype.name的写法(“.”的写法)是在原有的基础上把属性值改了,这样的话,name会跟随变化而变化,因为只是值发生了变化。
Person.prototype={},把原型改了,换了个新对象,换空间了。
//sunny
Person.prototype={}意味着Person.prototype换了一个空间,__proto__还是指向原来Person.prototype的那个空间,那个空间的name是sunny
可以类似于:obj1的name还是a
以下代码就是对上上图的简单描述:
另一种情况:
考虑预编译:function提上去,依次执行,最后cherry把sunny覆盖,答案是cherry