`

JavaScript prototype(原型)

 
阅读更多
//原型 prototype
创建每一个函数都有一个prototype,这个属性其实是一个指针,这个指针总是指向一个对象
这个对象的用途就是将特定的属性和方法包含在内,起到一个所有实例共享的作用。
//构造函数方式
--1.
function Person(name, age){
	this.name = name;
	this.age = age;
	this.sayName = function(){alert('我是姓名!')};
}	
	var p1 = new Person('z1',20);
	var p2 = new Person('z3',20);
	alert(p1.sayName == p2.sayName); //false 每次实例化的对象不同
	alert(p1.name == p2.name); //false 
	


--2.
function Person(name, age){
	this.name = name;
	this.age = age;
	this.sayName = sayName;
}	
function sayName(){
	alert(this.name);
}
p1.sayName = sayName;
p2.sayName = sayName;

var p1 = new Person('z1',20);
var p2 = new Person('z3',20);
alert(p1.sayName == p2.sayName); //true 实例化的内容相同


--3.
function Person(){}
var obj = Person.prototype;
obj.name = 'z3';
obj.age  = 20;
obj.sayName = function(){alert(this.name)};
var p1 = new Person();
var p2 = new Person();
alert(p1.age);
alert(p2.age);
alert(p1.sayName == p2.sayName);//true
var obj1 = p1.prototype;
/*
每次代码读取一个对象的属性的时候,优先使用实例对象里name的属性,若没有则取原型里面的属性。
*/
p2.name = 'w5';
alert(p2.name); //w5
//删除实例的属性(原型的属性使用delete无法删除)
delete p2.name;
//显示实例原型的名称
alert(p2.name); //z3


//关于原型的常见方法

//obj.isPrototypeOf(Object) 用于检查传入的对象的原型是否是obj
alert(obj.isPrototypeOf(p1)); //true

//Object.getPrototypeOf() 根据实例对象获取原型对象
var prototypeObj = Object.getPrototypeOf(p1);
alert(prototypeObj == Person.prototype); //true

//obj.hasOwnProperty() 判断一个属性是否是属于实例的属性还是原型的属性
var p3 = new Person();
alert(p3.name);
alert(p3.hasOwnProperty('name'));//false,非当前实例的属性


//in 判断一个属性是否存在实例的属性或者原型的对象中
var p4 = new Person();
p4.name = 'z6';
alert('name' in p4); //true
var p2 = new Person();
alert('name' in p2); //true



//手工创建方法, 判断一个属性是否是原型中的属性	
function isPrototypeProperty(name){
	var obj = this;
	alert(!obj.hasOwnProperty(name) && name in obj);
}
var p1 = new Person();
isPrototypeProperty.call(p1,'name'); //true

//ECMA5新特性 Object.keys
//获取当前对象所有keys, 返回一个数组
var p1 = new Person();
p1.name = 'z3';
p1.age = 20;
var attributes = Object.keys(p1);
alert(attributes.length); //2
alert(attributes); //name,age

//枚举对象所有的属性,不管内部属性能否被枚举,比如构造函数
//构造函数方式
function Person(){}
var obj = Person.prototype;
obj.name = 'z3';
obj.age  = 20;
obj.sayName = function(){alert(this.name)};

var atr = Object.getOwnPropertyNames(Person.prototype);/
alert(atr); //constructor,name,age,sayName
-------------------------------------------------------------------------------------------------

原型的另外一个作用就是扩展对象中的属性和方法

利用JS实现数组中每个元素的遍历

var arr = [1,2,3,[4,[5,6]]];
Array.prototype.each = function(fn){
	var obj = this;
	try{
		//1.遍历每一个元素
		obj.i || (obj.i=0); //需要用括号括起来
		//2.判断this对象是数组且数组的大小大于0
		if(this.length>0 && fn.constructor == Function){
			while(obj.i < obj.length){ //while循环的位置
				// 获取数组的每一项
				var element = obj[obj.i];
				// 如果当前元素获取到 并且当前元素是一个数组
				if(element && element.constructor == Array){
					element.each(fn);
				}else{
					fn.call(null,element);//等同于fn(element)
				}
				obj.i++;
			}
			obj.i=null; //释放内存(delete this.i)
		}
	}catch(ex){
		//do something
	}
	return this;
}
arr.each(function(item){
	alert(item);
});



在javascript中,“&&”运算符运算法则如下:
数据类型 转换为bool后的值
null		FALSE
undefined	FALSE
Object		TRUE
function	TRUE
0			FALSE
1			TRUE
0、1之外的数字 TRUE
字符串		TRUE
""(空字符串) FALSE

如果&&左侧表达式的值为真值,则返回右侧表达式的值;否则返回左侧表达式的值。 
这就是说
var i=""&&"真值";//->i=""
i="真值"&&"其他真值";//->i="其他真值"
i="真值"&&"";//->i=""


“||”运算符的运算法则如下: 

如果||左侧表达式的值为真值,则返回左侧表达式的值;否则返回右侧表达式的值。 
这就是说:
var i=""||"真值";//->i="真值"
i="真值"||"其他真值";//->i="真值"
i="真值"||"";//->i="真值"

 

分享到:
评论

相关推荐

    javascript prototype原型操作笔记.docx

    ### JavaScript Prototype原型操作知识点 #### 一、Prototype基础概念 **Prototype** 在 JavaScript 中是一个非常重要的概念,它支持面向对象编程中的继承特性。每个 JavaScript 对象都有一个内部属性 `[...

    javascript prototype原型详解(比较基础)

    javascript的prototype原型简单介绍: prototype原型是javascript中特别重要的概念,属于必须要掌握,如果没有良好的掌握的话,进一步用好或者学好js基本是不可能的实现的事情,并且此概念稍有难度,可能对于初次接触...

    javascript prototype原型操作笔记

    JavaScript中的prototype机制是其面向对象编程的核心概念之一,它允许开发者创建具有继承属性和方法的对象。在JavaScript中,几乎所有的对象都是通过某个构造函数或对象字面量创建的,而这些构造函数或对象自身都有...

    javascript prototype 原型链

    JavaScript中的原型链(Prototype Chain)是理解面向对象编程在JavaScript中的实现方式的关键概念。原型链是基于原型(Prototype)机制的一种实现,它允许对象继承其他对象的属性和方法。在JavaScript中,每个函数...

    JavaScript中的prototype原型学习指南

    Function 类型有一个属性 prototype,直接翻译过来就是原型。这个属性就是一个指针,指向一个对象,这个对象包含一些属性和方法,这些属性和方法会被当前函数生成的所有实例(对象)所共享。 这句话根据前面所说的,...

    javascript prototype文档.rar

    JavaScript中的原型(Prototype)是理解JavaScript继承机制的关键概念。它是一种对象属性,允许一个对象访问并继承另一个对象的属性和方法。在这个“javascript prototype文档”中,我们可以期待深入学习JavaScript...

    JavaScriptprototype的深度探索不是原型继承那么简单.pdf

    JavaScriptprototype的深度探索不是原型继承那么简单.pdf

    JavaScript的prototype

    JavaScript中的`prototype`是一个核心概念,它涉及到对象继承和函数原型。在JavaScript中,每创建一个函数,该函数就会自动获得一个名为`prototype`的属性,这个属性是一个对象,用于实现对象间的继承。同时,每个...

    跟我学习javascript的prototype原型和原型链

    在JavaScript编程语言中,prototype原型和原型链是理解其面向对象特性的核心概念。JavaScript是一种基于原型的语言,它与传统的面向对象语言(如Java或C#)不同,后者是基于类的继承模型。而JavaScript使用原型链来...

    javascript 原型模式实现OOP的再研究

    JavaScript中的原型模式是一种实现面向对象编程(OOP)的关键机制,它基于原型继承,使得对象可以从其他对象那里获得属性和方法。在这个模式下,每个函数都有一个`prototype`属性,这个属性是一个对象,用于共享属性...

    JavaScript中的prototype(原型)属性研究

    在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个对象,这个对象就是所谓的原型对象。当我们创建一个函数实例时,实例会自动获取一个内部属性[[Prototype]],这个属性通常通过`__proto__`或者`...

    原型设计模式prototype

    **原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...

    JavaScript使用prototype原型实现的封装继承多态示例

    JavaScript中的prototype是实现原型继承的关键,它允许我们向对象添加方法和属性。下面将详细介绍使用prototype实现封装、继承和多态的概念以及相关的代码示例。 首先,封装是面向对象编程中的一个核心概念,它涉及...

    JavaScript原型链

    JavaScript中的构造函数、`new`操作符和`prototype`属性也与原型链紧密相关。当我们使用`new`关键字调用一个构造函数时,会创建一个新的对象,这个新对象的`[[Prototype]]`被设置为构造函数的`prototype`属性所指向...

    JavaScript_Prototype(源代码+中文手册).rar

    这个压缩包文件“JavaScript_Prototype(源代码+中文手册).rar”包含了关于JavaScript原型的源代码和中文手册,为学习和理解这一主题提供了丰富的资源。 JavaScript是一种动态类型的语言,其核心特性之一就是原型...

    Advanced JavaScript (closures,prototype,inheritance)

    JavaScript,作为一种广泛应用于Web开发的脚本语言,其高级特性如闭包(closures)、原型(prototype)和继承(inheritance)是理解其精髓的关键。本文将深入探讨这些概念,帮助开发者更好地掌握JavaScript的核心。 ...

Global site tag (gtag.js) - Google Analytics