`
zhangzhennan
  • 浏览: 9560 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

浅谈javascript prototype constructor

阅读更多
  谢谢大家观看我的博客,接下来讲讲javascript prototype相关的内容,本人知识有限,希望有误的地方请多多指教!
  prototype可以概括为几句:
  prototype相当于java对象中的一个静态属性,所以每个新生成的对象都共有这个prototype属性,如果对prototype做相应的修改,新生对象--地址引用的属性(比如Array,{})都会有影响,而对于值引用的属性不会有影响(比如String,int).
   实例:
  
    function ClassA(){ }
		
		function Pro(){

			this.p1 = 'p1';

			this.fun1 = function(){
				console.log('fun1');
			};

			this.arr = [];
		}
		
		var pro = new Pro()
		ClassA.prototype = pro;

		var a1 = new ClassA();
		var a2 = new ClassA();//a1,a2共享prototype(pro)属性
		
		a1.p1 = 'a1p1';
		console.log('a1.p1='+a1.p1+'| a2.p1='+a2.p1);//这里是值引用所以a1.p1的改变不会影响a2.p1

		a1.arr.push(1,2,3);
		console.log('a1.arr='+a1.arr+'| a2.arr='+a2.arr);//这里是地址引用,所以a1.arr的改变会影响a2.arr
   


   关于constructor,我有两句话要说:1、constructor属性始终指向创建当前对象的构造函数。 2、每个函数都有一个默认的属相prototype,而这个prototype的constructor指向该函数。
  
    //constructor属性始终指向创建当前对象的构造函数
		//---每个函数都有一个默认的属性prototype,而这个prototype的constructor指向这个函数
		console.log('--Example_One--');
		var Person = function(name){
			this.name = name;
		};
		
		Person.prototype.getName = function(){
			return this.name;
		}
		
		var p = new Person('zhang');
		
		console.log(Person.constructor === Function); //true  创建Person对象的是Function
		console.log(p.constructor === Person); //true  创建p的是Person
		console.log(Person.prototype.constructor === Person);//true  函数prototype的constructor指向本函数
		console.log(p.constructor.prototype.constructor === Person);//true 根据上述关系得出的等式
		
		//特殊情况如果函数prototype的引用对象被改变,上述情况将不再存在
		console.log('---Example_Two---');
		var Student = function(name){
			this.name = name;
		};
		
		Student.prototype = {
			getName:function(){
				return this.name;
			}
		}
		
		var s = new Student('zhen');
		
		console.log(Student.constructor === Function );
		console.log(s.constructor === Student);
		console.log(Student.prototype.consturctor === Student);
		console.log(s.constructor.prototype.constructor === Student);
		
		//以上情况的解决办法
		
		console.log('---Example_Three---');
		var Animal = function(name){
			this.name = name;
		};
		
		/*
		Animal.prototype = {
			getName:function(){
				return this.name;
			}
		}
		*/
		Animal.prototype = new Object(
			{
				getName:function(){
					return this.name;
				}
			}
		);
		
		Animal.prototype.constructor = Animal;  //重新覆盖prototype的constructor
		
		var a = new Animal('zhen');
		
		console.log(Animal.constructor === Function );
		console.log(a.constructor === Animal);
		console.log(Animal.prototype.constructor === Animal);
		console.log(a.constructor.prototype.constructor === Animal);
   


  如有不对请大家不吝赐教!

分享到:
评论

相关推荐

    浅谈javascript面向对象编程

    ### 浅谈JavaScript面向对象编程 #### 一、概述 面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。在JavaScript中,尽管语言本身并不支持传统的类(class)概念,但开发者可以通过原型继承和其他技术来...

    浅谈javascript中的constructor

    这里有一点需要注意的是,每个函数都有一个prototype属性,这个prototype的constructor指向这个函数,这个时候我们修改这个函数的prototype时,就发生了意外。如 function Person(name,age){ this.name = name; ...

    浅谈javascript的原型继承

    首先,让我们理解JavaScript的原型(prototype)。每个函数在创建时都会自动获得一个`prototype`属性,这个属性是一个对象,用于定义实例对象可以继承的属性和方法。当试图访问一个对象的属性时,如果该属性不存在于...

    浅谈Javascript面向对象编程

    标题《浅谈Javascript面向对象编程》涉及了JavaScript语言在实现面向对象编程(OOP)方面的核心概念及其灵活运用。接下来,我们详细地梳理一下从给定文件内容中提取的关于JavaScript面向对象编程的知识点。 1. 数据...

    浅谈javascript原型链与继承

    首先,每个JavaScript对象都有一个内部属性`[[Prototype]]`,通常通过`__proto__`或`Object.getPrototypeOf()`访问。这个属性引用了创建该对象的函数的原型,即`prototype`对象。例如,在给定的例子中,我们创建了一...

    浅谈Javascript实现继承的方法

    这里使用`Object.create`创建了`Parent`原型的新副本,并将其设置为`Son`的原型,同时确保`Son.prototype.constructor`指向`Son`自身。这样,我们就实现了继承,且没有冗余的父实例。 除了以上方法,还有其他一些...

    浅谈javascript中new操作符的原理

    在JavaScript中,并没有像C++或Java那样的类,所有的对象都是基于原型(prototype)的。这意味着每个对象都有一个隐藏的属性`__proto__`(在旧版IE浏览器中是`prototype`),它引用了构造函数的`prototype`对象。 ...

    浅谈关于JavaScript的语言特性分析

    3. **原型**:JavaScript的继承机制基于原型链,每个对象都有一个`__proto__`指向其构造函数的`prototype`,`constructor`属性用于保存构造函数的引用。 理解并熟练掌握这些特性,对于提升JavaScript编程能力至关...

    浅谈js对象的创建和对6种继承模式的理解和遐想

    首先,让我们从对象的创建开始谈起。在JavaScript中创建对象有多种方式,其中工厂模式是一种比较传统的方法。工厂模式通过函数来封装创建对象的细节,并返回新创建的对象。但是工厂模式会创建出许多重复代码,且无法...

    浅谈JS的原型和继承

    在JavaScript中,所有的对象都源自`Object.prototype`,而`Object.prototype`的`__proto__`属性指向`null`,这构成了原型链的顶端。因此,无论对象如何复杂,沿着`__proto__`链追溯,最终都会到达`null`。 总结一下...

    浅谈JS继承_借用构造函数 & 组合式继承

    `SubType.prototype.constructor` 需要重新指向 `SubType` 以保持正确性。 总结来说,JavaScript 中的继承是通过原型链、借用构造函数和组合式继承等方法实现的。每种方法都有其优缺点,开发者需要根据实际需求选择...

    浅谈JS继承_寄生式继承 & 寄生组合式继承

    `inheritPrototype`函数就是这样做的,它创建了`superType.prototype`的一个副本,并将其`constructor`属性指向子类型,然后将这个副本赋值给子类型的原型。这样,子类型实例就可以继承超类型的方法,而构造函数调用...

    浅谈js内置对象Math的属性和方法(推荐)

    - `constructor`: 这个属性指向创建Math对象的函数,尽管Math不是一个构造函数,但这个属性通常用于确定一个对象的类型。 - `prototype`: 所有对象都有这个属性,Math也不例外,它用于添加或修改对象的方法。 - `...

Global site tag (gtag.js) - Google Analytics