理解原型设计模式以及JavaScript中的原型规则

文章详细阐述了JavaScript中的原型规则,包括引用类型的特性,如自由扩展属性,以及_proto_和prototype属性。同时介绍了不同设计模式,如工厂模式、构造函数模式、原型模式及其组合使用的混合模式和动态原型模式,展示了如何在JavaScript中创建和共享对象属性及方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原型规则

原型规则

所有的引用类型(数组、对象、函数),都具有对象特征,即可自由扩展属性;

var arr = []; arr.a =1;
  • 所有的引用类型都有对象的特性,即可自由扩展
  • 所有的引用类型都有一个_proto_属性(隐式原型),属性的值是一个普通对象
  • 所有函数,都具有一个prototype(显示原型),属性值也是一个普通原型
  • 所有的引用类型(数组、对象、函数),其隐式原型指向其构造函数的显式原型;(obj.proto === Object.prototype)
  • 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么回去它的_proto_(即它的构造函数的prototype)中去寻找

原型对象

prototype 在js中,函数对象其中一个属性:原型对象prototype。普通对象没有prototype属性,但有_proto_属性。 原型的作用就是给这个类的每一个对象都添加一个统一的方法,在原型中定义的方法和属性都是被所以实例对象所共享。

var person = function(name){
    this.name = name
};
person.prototype.getName=function(){//通过person.prototype设置函数对象属性
    return this.name; 
}
var crazy= new person(‘crazyLee’);
crazy.getName(); //crazyLee//crazy继承上属性

原型链

当试图得到一个对象f的某个属性时,如果这个对象本身没有这个属性,那么会去它的_proto_(即它的构造函数的prototype)obj._proto_中去寻找;当obj._proto也没有时,便会在obj._proto.proto(即obj的构造函数的prototype的构造函数的prototype)中寻找

设计模式

工厂模式

在函数内创建一个对象,给对象赋予属性及方法再将对象返回

function Person() {
	var People = new Object();
	People.name = 'CrazyLee';
	People.age = '25';
	People.sex = function(){
		return 'boy';
	};
	return People;
}

var a = Person();
console.log(a.name);//CrazyLee
console.log(a.sex());//boy

构造函数模式

无需在函数内部重新创建对象,而是用this指代

function Person() {
	this.name = 'CrazyLee';
	this.age = '25';
	this.sex = function(){
		return 'boy'
	};
	
}

var a = new Person();
console.log(a.name);//CrazyLee
console.log(a.sex());//boy

原型模式

函数中不对属性进行定义,利用prototype属性对属性进行定义,可以让所有对象实例共享它所包含的属性及方法

function Parent() {
	Parent.prototype.name = 'carzy';
	Parent.prototype.age = '24';
	Parent.prototype.sex = function() {
	 var s="女";

    console.log(s);
	}
}

var  x =new  Parent();  
console.log(x.name);      //crazy
console.log(x.sex());       //女

混合模式

原型模式+构造函数模式。这种模式中,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性

function Parent(){  
	this.name="CrazyLee";  
	this.age=24;  
};
Parent.prototype.sayname=function(){  
	return this.name;  
};

var x =new Parent(); 
console.log(x.sayname());   //Crazy  

动态原型模式

将所有信息封装在了构造函数中,而通过构造函数中初始化原型,这个可以通过判断该方法是否有效而选择是否需要初始化原型

function Parent(){  
	this.name="CrazyLee";  
	this.age=24;  
	if(typeof Parent._sayname=="undefined"){     
		Parent.prototype.sayname=function(){  
			return this.name;  
		}  
		Parent._sayname=true;  
	}         
};   

var x =new Parent();  
console.log(x.sayname()); 

参考:《原型设计模式以及JavaScript中的原型规则》

ps:文末附上汇总文章链接《一名【合格】前端工程师的自检清单【自检ing】》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值