_proto_与prototype理解分别怎么理解,搞了半天搞不懂

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
实例对象里面有个_proto_,构造函数里面有个prototype,看了半天就是没看明白,谁能一语惊破天么!!!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我也跟你发个地址吧,这个特别浅显易懂。。其实呢 每个对象都有个__proto__属性,这个东西指向的是生成改对象prototype。所以js对象(函数)里面,都有些自带的属性,比如__proto__,prototype。具体你自己好好看哈,看完这个你就懂了其继承机制了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
楼主先搞懂 __proto__ 和 prototype 的区别。
可以看下官方文档
关于继承,我前段时间刚好回顾了下
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:js代码(8)
最近在做面向对象的js开发,基础知识比较欠缺,恶补了一下,搜到了不少结果,但是总是感觉知识混乱,没有头绪,在看了众多文章后,顺着思路理清一下知识。
一、prototype和__proto__的概念
prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性。
__proto__是一个实例对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性。
用chrome和FF都可以访问到对象的__proto__属性,IE不可以。
(1)prototype:
function定义的对象有一个prototype属性,prototype属性又指向了一个prototype对象,注意prototype属性与prototype对象是两个不同的东西,要注意区别。在prototype对象中又有一个constructor属性,这个constructor属性同样指向一个constructor对象,而这个constructor对象恰恰就是这个function函数本身。
是不是很绕?用伪代码表示如下:
var function{
prototype:prototype{
constructor:constructor == function
(2)_proto_
var Person = function(){};
var p = new Person();
在new一个对象时,实际上js做了三件事情:
(a) var p={}; 也就是说,初始化一个对象p
(b) p.__proto__ = Person.
(c) Person.call(p); 也就是说构造p,也可以称之为初始化p
关键在于第二步,我们来证明一下:
var Person = function(){};
var p = new Person();
alert(p.__proto__ === Person.prototype);
&/pre&&div style=&text-align:left&&(3)constructor:&/div&&div style=&text-align:left&&理解了__proto__这个属性链接指针的本质。。再来理解constructor。 当定义一个prototype的时候,会构造一个原形对象,这个原型对象存储于构造这个prototype的函数的原形方法之中. &/div&&div style=&text-align:left&&&pre code_snippet_id=&576876& snippet_file_name=&blog__7076511& name=&code& class=&javascript&&function Foo(y){
Foo.prototype.x = 10;
Foo.prototype.calculate = function(z){
return this.x+this.y+z;
var b = new Foo(20);
alert(b.calculate(30));
函数:原型
每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。
prototype的定义
你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在。你可以看看下面的例子:
Example PT1
function Test()
alert(Test.prototype); // 输出 &Object&
给prototype添加属性
就如你在上面所看到的,prototype是一个对象,因此,你能够给它添加属性。你添加给prototype的属性将会成为使用这个构造函数创建的对象的通用属性。
例如,我下面有一个数据类型Fish,我想让所有的鱼都有这些属性:livesIn=&water&和price=20;为了实现这个,我可以给构造函数Fish的prototype添加那些属性。
Example PT2
function Fish(name, color)
this.name=
this.color=
Fish.prototype.livesIn=&water&;
Fish.prototype.price=20;
接下来让我们作几条鱼:
var fish1=new Fish(&mackarel&, &gray&);
var fish2=new Fish(&goldfish&, &orange&);
var fish3=new Fish(&salmon&, &white&);
再来看看鱼都有哪些属性:
for (int i=1; i&=3; i++)
var fish=eval_r(&fish&+i); & // 我只是取得指向这条鱼的指针
alert(fish.name+&,&+fish.color+&,&+fish.livesIn+&,&+fish.price);
输出应该是:
&mackarel, gray, water, 20&
&goldfish, orange, water, 20&
&salmon, white water, 20&
你看到所有的鱼都有属性livesIn和price,我们甚至都没有为每一条不同的鱼特别声明这些属性。这时因为当一个对象被创建时,这个构造函数 将会把它的属性prototype赋给新对象的内部属性__proto__。这个__proto__被这个对象用来查找它的属性。
你也可以通过prototype来给所有对象添加共用的函数。这有一个好处:你不需要每次在构造一个对象的时候创建并初始化这个函数。为了解释这一点,让我们重新来看Example DT9并使用prototype来重写它:
用prototype给对象添加函数
Example PT3
function Employee(name, salary)
this.name= & & & & & & &&
this.salary=
Employee.prototype.getSalary=function getSalaryFunction()
return this.
Employee.prototype.addSalary=function addSalaryFunction(addition)
this.salary=this.salary+
我们可以象通常那样创建对象:
var boss1=new Employee(&Joan&, 200000);
var boss2=new Employee(&Kim&, 100000);
var boss3=new Employee(&Sam&, 150000);
并验证它:
alert(boss1.getSalary()); & // 输出 200000
alert(boss2.getSalary()); & // 输出 100000
alert(boss3.getSalary()); & // 输出 150000
这里有一个图示来说明prototype是如何工作的。这个对象的每一个实例(boss1, boss2, boss3)都有一个内部属性叫做__proto__,这个属性指向了它的构造器(Employee)的属性prototype。当你执行 getSalary或者addSalary的时候,这个对象会在它的__proto__找到并执行这个代码。注意这点:这里并没有代码的复制(和 Example DT8的图表作一下对比)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:68827次
排名:千里之外
原创:45篇
转载:29篇
(1)(1)(1)(1)(2)(1)(3)(2)(2)(1)(3)(2)(1)(1)(2)(2)(1)(1)(3)(1)(11)(1)(3)(6)(1)(1)(1)(4)(5)(9)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(39f861b5c7624370-ua98).
重新安装浏览器,或使用别的浏览器}

我要回帖

更多关于 prototype proto 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信