码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript - 原型

时间:2015-03-15 22:41:08      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

    只要创建了一个新函数,该函数就会有一个指向原型对象的prototype属性,而原型对象则会自动获得一个指向该函数的constructor属性。

    当调用构造函数创建一个新实例后,该实例会有一个属性指向构造函数的原型对象[[Prototype]](Firefox、Chrome、Safari中该属性为__proto__)。

    因此,实例和构造函数间没任何直接的联系,连接仅存在于实例与构造函数的原型对象间。

function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
    alert(this.name);
};
var person1 = new Person();
var person2 = new Person();

技术分享

    当读取代码的某个属性时,都会先搜索对象实例本身,若无该属性才会搜索其原型对象。

    如果在实例中添加与原型中同名的属性时,该实例的属性将会屏蔽原型中的属性(基于上面的搜索方式),但原型中的值未变,使用delete操作符删除实例属性时,原型中的属性便可重新访问。

person1.name = "Greg";
alert(person1.name); //"Greg"——来自实例
alert(person2.name); //"Nicholas"——来自原型
delete person1.name;
alert(person1.name); //"Nicholas"——来自原型

 

 

原型相关方法:

结果基于代码:

function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
    alert(this.name);
};
var person1 = new Person();
var person2 = new Person();

isPrototypeOf()

alert(Person.prototype.isPrototypeOf(person1)); //true
alert(Person.prototype.isPrototypeOf(person2)); //true

Object.getPrototypeOf(), 返回[[Prototype]] 的值

alert(Object.getPrototypeOf(person1) == Person.prototype); //true
alert(Object.getPrototypeOf(person1).name); //"Nicholas"

hasOwnProperty(),检测一个属性是存在于实例中,还是存在于原型中,这个方法继承于Object,只在给定属性存在于对象实例中时,才会返回 true。

alert(person1.hasOwnProperty("name")); //false

person1.name = "Greg";
alert(person1.name); //"Greg" ——来自实例
alert(person1.hasOwnProperty("name")); //true

in操作符,准确来说不属于方法,在单独使用时,in操作符会在通过对象能够访问给定属性时返回 true,无论该属性存在于实例中还是原型中。在使用 for-in 循环时,返回的是所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性。

alert("name" in person1); //true

Object.keys(),接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组

var keys = Object.keys(Person.prototype);
alert(keys); //"name,age,job,sayName"
var p1 = new Person();
p1.name = "Rob";
p1.age = 31;
var p1keys = Object.keys(p1);
alert(p1keys); //"name,age"

Object.getOwnPropertyNames(),得到所有实例属性

var keys = Object.getOwnPropertyNames(Person.prototype);
alert(keys); //"constructor,name,age,job,sayName"

JavaScript - 原型

标签:

原文地址:http://www.cnblogs.com/sduzhangxin/p/4340622.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!