JS中的原型--Prototypes

一、对象中的原型_proto_

  JavaScript中的对象是基于原型的。原型是其他对象的基础,它定义并实现了一个新创建的对象必须包含的成员列表。原型对象为所有对象实例所共享

对象通过一个内部属性绑定到它的原型。在FireFox、Safari、和Chrome浏览器中,这个属性_proto_对开发者可见。一旦你创建一个内置对象(比如Object和Array)的实例,它们就会自动拥有一个Object实例作为原型。

因此,对象可以拥有两种成员类型:实例成员和原型成员。实例成员直接存于对象实例中,原型对象则从对象原型继承而来。

这就是为什么明明没有为对象定义 toString 方法,但是却可以在对象上调用此方法的原由。因为toString()是由对象person继承来的原型成员。

同样可以用 hasOwnProperty() 方法来判断对象是否包含特定的实例成员。要确定对象是否包含特定属性,可以用 in 操作符。

var book = {
    title: "High Performance JavaScript",
    author: "Nicholas C.Zakas"
}

console.log(book.hasOwnProperty(‘title‘)); //true
console.log(book.hasOwnProperty(‘toString‘)); //false

console.log("title" in book); //true
console.log("toString" in book); //true

使用 in 操作符时,两种情况都会返回true,因为它既会搜索实例也会搜索原型

二、函数中的原型prototype

  每个函数创建后都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象包含了基于此函数创建的所有实例共享的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。(若原型对象中的值发生变化,继承了此原型对象的实例的对应值也会发生变化。不过如果该实例的某个继承来的属性被已经被重新赋值的话,便不会变化)。

//构造函数的两种写法
//1. 构造函数中的 this 绑定的是实例化后的对象,否则指向的是全局变量window
var Person = function(){
    this.name = ‘Kuro-P‘;
    this.age = 22;
    this.say = function(){
        console.log(‘Hello‘);
    }
}

var p1 = new Person();
console.log(p1.name); //Kuro-P

Person();
console.log(name); //Kuro-P

//2.写到原型对象上,与第一种写法作用相同,只不过是不实例化时,全局中不存在对应属性

var Person = function(){
}
Person.prototype.name = ‘Kuro-P‘;
Person.prototype.age = 22;
Person.prototype.say = function(){
        console.log(‘Hello‘);
}

var p2 = new Person();
console.log(p2.name); //Kuro-P

Person();
console.log(name); //undefined

*注:本篇总结是基于《JavaScript高级程序设计》中第六章和《高性能JavaScript》中第二章

原文地址:https://www.cnblogs.com/Kuro-P/p/8673380.html

时间: 2024-08-06 15:16:32

JS中的原型--Prototypes的相关文章

谈谈JS中的原型

不知道大家对JS中的原型理解的怎么样,我想如果大家对JS中的原型对象以及prototype属性十分熟悉的话对后面原型链以及继承的理解会十分的容易,这里想和大家分享自己对其的理解,请先看下面这段代码O(∩_∩)O~~ 1 function Person(){ 2 } 3 Person.prototype.name = "jingzi"; 4 Person.prototype.age = 20; 5 Person.prototype.sayName = function(){ 6 aler

js中的原型、继承的一些想法

最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享, 一.instanceof 在JavaScript有instanceof运算符,是二元运算符,使用方法 instanceA instanceof A,返回值是布尔值(boolean),含义是判断instanceA是否是A的一个实例,其实质是判断A.prototype===instanceA.__p

js中的原型与原型链详解

js中的原型与原型链详解 记住下面三句话就可以理解原型: 所有的函数数据类型都天生自带一个属性Prototype(原型)这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存 在浏览器给prototype开辟的堆内存当中有一个天生自带的属性是constructor,这个属性存储的值是当前函数本身 每一个对象都有一个__proto__的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是Object的实例) 原型链:如果引用构造函数的实例想要查找某个属性p的话: 首

js中的原型prototype

var arr1 = new Array(12,34,98,43,38,79,56,1); arr1.sum=function (){ var result = 0; for(var i=0; i<this.length; i++){ result += this[i]; } return result; }; alert(arr1.sum()); 如果现在还有个arr1 对象也要求和 var arr2 = new Array(54,29,1,10); 那么还要给 arr2再添加一个求个的方法

JS中的原型继承机制

转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西.一般人们叫它函数.比如下面的代码 js代码: [javascript] view plaincopy function Person(name) { alert(name); } Perso

JS中的原型对象与构造器

在Javascript中:原型对象是属于构造函数的,不属于实例:实例只能共享原型对象中的属性和方法(当然也可以有自己的属性和方法,或者覆盖原型中同名的属性和方法):构造器constructor属于原型的,不属于实例:实例之所以能有constructor属性是因为它共享了原型对象的所有成员,包括原型对象的constructor属性: function Wede(){this.name="zhao"} //输出构造函数的原型对象console.log(Wede.prototype); //

JS中的原型模式

创建一个对象,先来看一段代码: // 例如创建一个 Person 的构造函数, 让人有名字, 可以说话 function Person ( name ) { this.name = name; // 可以说话, 需要有一个方法 this.sayHello = function () { console.log( '你好, 我是 ' + this.name ); }; } var p1 = new Person( '小明' ); var p2 = new Person( '大伟' ); conso

JS中注意原型链的“指向”

昨天压缩Js文件时发现了项目中的一个prototype的问题代码如下所示: 1. <script> var XXX = function(){ }; var x1 = new XXX(); XXX.prototype.fnx = function(){ alert("123"); } x1.fnx(); </script> 2. <script> var XXX = function(){ }; var x1 = new XXX(); XXX.pro

JS中的原型

1.我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象. 2.如果函数作为一个普通函数调用,prototype没有任何作用,当该函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过__ptoto__来访问该属性. 3.原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中. 4.当我们访问对象的属性