详谈prototype和__proto__原型

版权声明:EGEEK https://blog.csdn.net/qq_41604269/article/details/82995692

prototype原型

创建的每一个函数,解析器都会添加一个属性prototype,称为原型。

  • 属性prototype会指向一个原型对象
  • 普通函数调用prototype没有任何作用
  • 构造函数(类)调用prototype,通过构造函数(类)创建的对象(实例)都有一个隐含的属性__proto__,可以通过__proto__指向同一个原型对象

特点:原型对象相当于一个公共的区域,所有同一个类的实例都可以访问到同一个原型对象,可以将对象中共有的内容,统一设置到原型对象中,供所有的实例访问。

作用:创建构造函数时,可以将这些对象共有的属性和方法,统一添加到原型对象prototype中,节省空间。
实例1:

	<script type="text/javascript">
		function Person(name,gender,age){
			this.name = name;
			this.gender = gender;
			this.age = age;
		}

		//原型中添加共有方法setName
		Person.prototype.setName = function(){
			return this.name;
		}
                //原型中添加共有属性a
                Person.prototype.a = 123;

		per1 = new Person("张三","男",18);
		per2 = new Person("李四","男",18);

                //当访问对象的一个属性或方法时,会先在自身寻找,没有则到原型对象中寻找
		alert(per1.setName());
		alert(per2.setName());
		alert(Person.prototype == per1.__proto__);
	</script>

检查属性是否存在,若存在,是存在于在哪里?

1、属性 in 对象 

只能检查属性是否存在,无法判断具体位置。

2、hasOwnProperty

能检查出属性的具体位置。

代码接实例1:

		//in
		alert("name" in per1);  //true,只说明name属性存在
		alert("a" in per1);     //true,只说明a属性存在

		//hasOwnProperty
		alert(per1.hasOwnProperty("name"));  //true,说明对象本身有name属性
		alert(per1.hasOwnProperty("a"));  //false,说明对象本身没有属性
		alert(per1.__proto__.hasOwnProperty("name")); //false,说明原型对象里没有name属性
		alert(per1.__proto__.hasOwnProperty("a"));  //true,说明原型对象里有该属性

hasOwnProperty是对象的原型对象原型对象里的属性(最深层)

代码接实例1:

		alert(per1.__proto__.hasOwnProperty("hasOwnProperty"));//false,per1.__proto__不存在hasOwnProperty属性
		alert(per1.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));//true,per1.__proto__.__proto__存在hasOwnProperty属性

猜你喜欢

转载自blog.csdn.net/qq_41604269/article/details/82995692
今日推荐