我们知道对象可以通过直接量创建,在这个过程中,系统实际上是调用了js中的全局静态函数Object.create()函数(在这个地方没有验证)创建,这时其原型为Object原型,不知道这里为什么obj可以使用Array原型的方法,如sort函数等。
通过这些可以看到,原型像是模板,对象就是模板的实例。但是在js中对象是可变的,就是说我们可以对对象添加属性元素或者是方法,这里就有了对象方法和原型方法的区别了,相信到这里,我们也知道了对象方法和原型方法的区别了。同时还有一个特别重要的概念-原型链,因为你继承的原型还有可能继承另外一个原型,依次下去自然成了一个原型链,可以看出一个链表,结构如下:
我们可以通过下面的例子来理解上面的结构:
var base = {nick:"Lee"} function obj() { this.name = "David"; } obj.prototype = base; obj.prototype.show = function() {console.log(this)} var o = new obj(); console.log(o); //{ name: 'David'} console.log(o.prototype); //undefined ?这是为什么,不是对它的原型进行了赋值吗?o只是obj的一个实例 console.log(typeof o); //object console.log(o.nick); //Lee base.show(); //{ nick: 'Lee', show: [Function] } o.show(); //{ name: 'David' } console.log(base); //{ nick: 'Lee', show: [Function] } console.log(o); //{ name: 'David' }
当使用直接量来创建一个对象base时,其实其创建了一个原型链,其图如下:
当定义一个构造函数obj()时,通过构造函数创建对象o,对应的原型链如下图所示:
可以看到对象和原型之间的区别很小,可以说对象也可以看成是原型,只要有另外一个对象继承它。到这里我们就不难理解prototype的含义了,对象的prototype属性值指向的是他的原型,但是在对象中不能显示出prototype属性的值,不知道为什么。
>> 几个有名的__proto__,prototype 图
var foo = { x:10, y:20 };
var a = { x: 10, calculate: function (z) { return this.x + this.y + z; } }; var b = { y: 20, __proto__: a }; var c = { y: 30, __proto__: a }; // call the inherited method b.calculate(30); // 60 c.calculate(40); // 80
// a constructor function function Foo(y) { // which may create objects // by specified pattern: they have after // creation own "y" property this.y = y; } // also "Foo.prototype" stores reference // to the prototype of newly created objects, // so we may use it to define shared/inherited // properties or methods, so the same as in // previous example we have: // inherited property "x" Foo.prototype.x = 10; // and inherited method "calculate" Foo.prototype.calculate = function (z) { return this.x + this.y + z; }; // now create our "b" and "c" // objects using "pattern" Foo var b = new Foo(20); var c = new Foo(30); // call the inherited method b.calculate(30); // 60 c.calculate(40); // 80 // let's show that we reference // properties we expect console.log( b.__proto__ === Foo.prototype, // true c.__proto__ === Foo.prototype, // true // also "Foo.prototype" automatically creates // a special property "constructor", which is a // reference to the constructor function itself; // instances "b" and "c" may found it via // delegation and use to check their constructor b.constructor === Foo, // true c.constructor === Foo, // true Foo.prototype.constructor === Foo, // true b.calculate === b.__proto__.calculate, // true b.__proto__.calculate === Foo.prototype.calculate // true );
url: http://dmitrysoshnikov.com/ecmascript/javascript-the-core/
<!--[endif]-->
相关推荐
总的来说,JavaScript中的面向对象编程与传统的基于类的OOP有所不同,它通过原型链和构造函数来实现对象的创建和继承。正确理解并运用这些概念,可以让开发者更有效地利用JavaScript进行面向对象的编程。
javascript-原型与原型链
在JavaScript中,面向对象编程基于原型,这使得它与其他面向对象语言(如Java或C++)有所不同。以下是对JavaScript面向对象和原型机制的详细解释: 1. 面向对象的基本概念: - 类:在许多面向对象语言中,类是创建...
JavaScript原型链是JavaScript语言中的一个核心特性,它关乎对象之间的继承关系。在JavaScript中,一切皆为对象,而原型链则是实现对象间属性和方法共享的一种机制。理解原型链对于深入学习JavaScript至关重要。 ...
本文将深入探讨JavaScript原型链的工作原理及其可能导致的安全问题——原型链污染。 首先,JavaScript 中的对象继承并不像传统面向对象语言那样基于类,而是通过原型链机制。每个对象都有一个内部属性`[[Prototype]...
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
JavaScript中的原型模式是一种实现面向对象编程(OOP)的关键机制,它基于原型继承,使得对象可以从其他对象那里获得属性和方法。在这个模式下,每个函数都有一个`prototype`属性,这个属性是一个对象,用于共享属性...
JavaScript:对象与原型链教程.docx
JavaScript 中的原型和继承详解 在 JavaScript 中,原型和继承是两个非常重要的概念。这篇文章将详细解释 JavaScript 中的原型和继承机制,并通过图文方式帮助读者更好地理解这些概念。 一、对象和类 在 ...
在利用构造函数创建对象时,每个对象都默认与这个原型对象连接,连接后就可以访问到原型对象中的属性和方法 6.6.1 原型 2、作用 利用原型对象可以保存一些公共的属性和方法。当访问某个对象中的一个不存在的属性或...
在JavaScript中,函数扮演着至关重要的角色,它们不仅仅是代码块,更是数据的一种形式。JavaScript的灵活性使得函数可以作为变量、对象的方法甚至构造函数使用。理解函数的原型链和闭包对于深入掌握JavaScript至关...
在JavaScript中,由于没有像Java那样的类概念,因此继承机制是基于原型(prototype)实现的。每个函数都有一个名为`prototype`的属性,它实际上是一个指针,指向该函数的原型对象。这个原型对象具有一个默认属性`...
JavaScript原型和闭包是这门语言中两个比较难以理解且与其他面向对象语言区别较大的概念。理解这两个概念,不仅能让我们更深层次地理解JavaScript,而且有助于我们了解编程语言的设计思路,拓宽我们的视野。 首先,...
javascript Map原型,对象,实现javascript中的Map数据类型功能
JavaScript中的闭包和原型模型是理解其面向对象编程机制的关键概念。闭包是一种特性,允许函数访问并操作其外部作用域中的变量,即使在外部函数已经执行完毕后,内部函数仍然能保持对外部变量的引用。这在JavaScript...
### 原型与`constructor`属性 通常,`prototype`对象上有一个`constructor`属性,指向创建它的函数。比如: ```javascript console.log(Person.prototype.constructor === Person); // true ``` `constructor`属性...
#### 一、JavaScript与原型继承的基础 JavaScript(简称JS)是一种广泛使用的高级编程语言,在Web开发中占据着核心地位。它的特性之一是基于原型的继承机制,这与其他采用类继承的语言(如Java或C#)形成了鲜明对比...