prototype属性,只有function对象中才具有的显式属性;
网上三种理解:
1:通过构造函数创建的普通对象,通过其constructor属性引用它的构造函数对象,从而间接引用(拥有)了构造对象中的prototype对象;
如图:
此观点的文章: 参看 jimichan的文章:
详解javascript类继承机制的原理 中的:
“(说成间接的是因为每个object都有一个 constructor 属性指向它的构造函数)。”
非常感谢在此问题上,作者对我的回信;如有冒犯,敬请原谅;
2:构造函数创建对象时,copy prototype中的属性和代码给所创建的对象。从而使创建的对象拥有了prototype中的所有功能和属性;
如图:
此观点的文章: 参看 yiding_he的文章:
领悟 JavaScript 中的面向对象 中的:
“ 在 JavaScript 中,用 new 关键字创建对象是执行了下面三个步骤的:
1. 创建一个新的普通对象;
2. 将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。
3. 以新的普通对象作为上下文来执行方法对象。”
此观点在回贴中被 xieye反对
3:构造函数在创建对象时,把构造函数中的prototype引用赋给创建的普通对象;也就是说由构造函数创建的对象,都有一个指针指向prototype对象;
如图:
此观点的文章: 参看 李站的文章:
悟透javascript中的
" 我们已经知道,用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步:第一步是建立一个新对象;第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象;第三步就是将该对象作为this参数调用构造函数,完成成员设置等初始化工作。对象建立之后,对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,与构造函数再扯不上关系了" 以及
“语法甘露 中的:上面代码的最后一句证明,新创建的对象的constructor属性返回的是Object函数。其实新建的对象自己及其原型里没有constructor属性,那返回的只是最顶层原型对象的构造函数,即Object。”
综上所述:根据贴子:
领悟 JavaScript 中的面向对象 中作者 afcn0的回贴
“其实还有补充,就是如果构造函数返回object类型,那new对象无效,prototype问题是楼主还不太了解prototype继承方式,__proto__属性,以及isPrototypeOf方法所至 ” 的提示,查阅了文章:
javascript中的继承
此文中提到:jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau");
调用这句时,都发生了什么:
1 当js看见new操作符,它创建一个新的普通对象,并且设置它的__proto__ 属性为Engineer.prototype。
2 new 操作符传递这个新的对象作为Engineer 构造器的this的值。
其实最主要做的事就是上面的两件,剩下的都是很简单的函数调用.
根据上文的提示作了简单测试:
function person(name,b){
this.name=name;
}
person.prototype.sayHello=function(a){
//alert("hello,i am "+this.name);
alert(this==a);
}
function employee(name, salary)
{
person.call(this, name); //调用上层构造函数
this.salary = salary; //扩展的成员
};
var p=new person("yangsp",p);
//p.sayHello(p);
//alert(p.constructor);
//下面两句验证了普通对象中确有_proto_属性,且引用的是prototype对象;(在ff下调试,ie下不可);
alert(p.__proto__==person);
alert(p.__proto__==person.prototype))
//alert("p有prototype属性吗? "+p.prototype); //表明普通对象中没有prototype属性;
总结:
比较赞同第三种理解;
即:prototype是function对象中专有的属性。
_proto_是普通对象的隐式属性,在new的时候,会指向prototype所指的对象;
普通对象中的constructor属性指向构造函数,因此一个用构造函数创建的对象可能有两种方式关联到prototype.但继承应该是根据_proto_关联到prototype属性;
另外:
ecma-262中提到:every object created by that constructor has an implicit reference to the prototype (called the object's prototype) associated with its constructor 以及其图示;不敢肯定它的implicit reference间接还是隐式链接;
感谢所有提借帮助的作者。若有冒犯,敬请原谅;由于本人是新手,所有结论都是根据网上资源整理后自己猜测得出的;所以会有很多错误,真诚期待你的指正;
分享到:
相关推荐
Prototype是JavaScript语言中的一种设计模式,它主要用于对象的创建和扩展。这个压缩包中的"Prototype学习笔记.doc"很可能是对Prototype模式深入理解的详细文档。下面将从Prototype设计模式的基本概念、在JavaScript...
这个标题表明我们即将探讨的是关于Prototype的官方文档,这是一份集合了官方资源和个人理解整理而成的综合指南。Prototype是一个JavaScript库,它为JavaScript编程提供了许多实用的功能,包括对象扩展、类创建、DOM...
本资源包"JavaScript学习资料全面整理"显然是为了帮助初学者和进阶者深入理解这门语言,包含了各种资源,下面将对JavaScript的一些关键知识点进行详细阐述。 1. **基础概念**:JavaScript是一种解释型、弱类型、...
这个名为“JavaScript学习资料整理”的系列资源,旨在帮助开发者构建完整的JavaScript前端知识体系,从而深入理解和积累JavaScript的开发经验。通过研究这个压缩包中的内容,我们可以系统地学习JavaScript的各种关键...
JavaScript,是一种广泛应用于网页和网络应用的脚本语言,它主要负责实现客户端的交互效果,增强用户界面。作为互联网上最流行的编程语言之一,JavaScript在网页开发中的地位至关重要。这篇中文简介将帮助初学者理解...
JavaScript是Web开发中不可或缺的一部分,它是一种轻量级的脚本语言,主要应用于网页和网络应用的客户端。韩顺平老师的JavaScript笔记全面涵盖了基础语法、面向对象编程以及DOM编程,这些都是学习JavaScript时至关...
在提供的文件列表中,虽然“张孝祥正在整理Java就业面试题大全.doc”并非与JavaScript直接相关,但这个文档可能包含了关于Java面试的知识点,这同样对理解软件开发过程和职业发展有所裨益。了解Java面试常见问题,也...
本资料"Javascript数组操作整理"聚焦于JavaScript中的数组操作,旨在帮助开发者更好地理解和掌握相关知识。 1. 创建数组: JavaScript提供了多种创建数组的方式,如字面量语法`var arr = [元素1, 元素2, ...]`,或...
总的来说,理解并熟练掌握JavaScript数组的`length`属性及其动态调整特性,以及如何利用`prototype`来扩展对象功能,是成为一名优秀的JavaScript开发者必备的基础。在软件开发过程中,灵活运用这些知识能够提高代码...
JavaScript是一种广泛应用于网页和互联网应用开发的脚本语言,它主要负责实现客户端的交互效果、动态更新内容以及处理用户输入。这份"javascript-思维导图"涵盖了JavaScript的基础知识和核心概念,是学习和复习...
### JavaScript 面试基础知识梳理 #### 1. 原始值和引用值类型及区别 ...以上知识点覆盖了 JavaScript 面试中经常遇到的基础和核心概念,理解并掌握这些知识点对于提高编程技能和面试成功非常重要。
JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和动态应用程序时不可或缺。面向对象编程(Object-Oriented Programming, OOP)是JavaScript中的核心概念之一,它允许开发者通过类和对象来组织...
JavaScript高级程序设计是一门深入理解JS语言核心概念和技术的关键领域。在学习过程中,我们经常会遇到各种挑战,例如UTC和格林威治时间的概念、类型检测、数组的定义、事件处理以及对象原型等。以下是对这些知识点...
在JavaScript中,`prototype`是实现面向对象编程的关键机制,它允许对象共享属性和方法,从而实现类的概念。本文将深入探讨`prototype`的核心概念、使用方式以及与之相关的`Class.create()`和`Object.extend()`两个...
JavaScript是一种广泛应用于互联网的脚本语言,它的特点和组成部分是学习的重点。在本文中,我们将详细探讨JavaScript的主要知识点,包括它的特点、组成部分、数据类型以及对象原型链等相关概念。 首先,JavaScript...
Prototype 是一个 JavaScript 库,由 Sam Stephenson 编写,旨在简化和增强 Web 应用程序的开发。它提供了一系列兼容标准的工具和方法,帮助开发者创建具有高交互性和胖客户端特性的 Web 应用。Prototype 主要目标是...
根据提供的文件信息,可以看出这份“我的javascript学习笔记”主要涵盖了JavaScript中的几个关键概念和技术要点,包括正则表达式、AJAX以及一些JavaScript的核心语言特性。接下来将这些知识点进行详细的整理和解释。...
在JavaScript中,函数可以通过以下三种方式进行创建: 1. **命名函数**:这是最常见的一种方式,可以直接通过`function`关键字来定义一个具有名称的函数。 ```javascript function 函数名() { // 函数体 return...