美文网首页
关于JS原型对象

关于JS原型对象

作者: 7天苹果 | 来源:发表于2017-07-30 18:32 被阅读28次

原型对象的基本概念

无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。

在默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性是一个指向prototype属性所在函数的指针。

每个对象上都支持一个属性_ proto _,这个属性连接存在于实例与构造函数的原型对象之间,而不是存在于实例与构造函数之间。

如下图:


构造函数、原型属性以及实例之间的关系

实例person1和person2的内部属性指向了Person.prototype,它们与构造函数没有直接的关系。

使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中:访问的是实例属性就返回true,原型属性返回false。

比如:

function Person(){
}
Person.prototype.name = "john";
Person.prototype.age = 29;
Person.prototype.job = "software engineer";
Person.prototype.sayName = function(){
  alert(this.name);
};

var person1 = new Person();
alert(person1.hasOwnProperty("name"));  //false

person1.name = "greg";
alert(person1.name);
person1.hasOwnProperty("name");  //true

获得属性的方法

  • Object.keys()
    取得的是可枚举的实例属性,接收一个对象为参数,返回一个包含所有可枚举属性的字符串。(不包含原型对象上的属性)
  • Object.getOwnPropertyNames()
    得到所有的实例属性,无论它是否可枚举。

更简单的原型语法

使用一个包含所有属性和方法的对象字面量来重写整个原型对象,可以减少不必要的输入。

function Person(){
}

Person.prototype = {
  name : "John";
  age:29;
  job:"software engineer";
  sayName:function(){
    alert(this.name);
  }
}

这种方法有一个例外:constructor属性不再指向Person了。指向Object构造函数。


所以这种情况下这样做会报错:

function Person(){
}

var friend = new Person();

Person.prototype = {
  name : "John";
  age:29;
  job:"software engineer";
  sayName:function(){
    alert(this.name);
  }
}

friend.sayName();   //error

解决方案是这样:

function Person(){
}

Person.prototype = {
  constructor:Person,  //添加constructor属性,设置为Person
  name : "John",
  age:29,
  job:"software engineer",
  sayName:function(){
    alert(this.name);
  }
}
var friend = new Person();

friend.sayName();   //John

原型对象的问题

  • 省略了构造函数传递初始化参数这一环节,结果所有的实例在默认情况下都将取得相同的属性值。
  • 原型模式的最大问题是由其共享的本质所导致的。
    原型中所有属性是被许多实例共享的,所以对于包含引用类型值的属性来说,问题就比较突出了。
function Person(){
}

Person.prototype = {
  name : "John";
  age:29;
  friends:["shelby","jenny"]
  job:"software engineer";
  sayName:function(){
    alert(this.name);
  }
}

var person1 = new Person();
var person2 = new Person();

person1.friends.push("van");
alert(person1.friends); //"shelby","jenny","van"
alert(person2.friends); //"shelby","jenny","van"

这也是我们为什么不去单独使用原型模式的原因。

相关文章

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • 关于JS中的原型和原型链

    目录 关于js 对象和原型 原型链 基于原型链的继承 参考资料ECMAScript 6 入门JavaScript原...

  • Web前端------JS原型、原型链详解

    转载至: JS原型链详解JS是基于对象的语言,原型对象是其模拟面向对象的一种方式,关于原型有两种表现形式:一种是p...

  • 关于JS原型对象

    原型对象的基本概念 无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属...

  • 原型和原型链的简单理解

    原型 在JS中原型就是prototype对象,用来表示类型之间的关系。 原型链 JS中对象和对象之间是有联系的,通...

  • Js面向对象

    一、Js面向对象 二、Js原型及原型链 1、原型 JavaScript 的每个对象都继承另一个父级对象,父级对象称...

  • 2022前端高频面试题

    JS相关 1.原型和原型链是什么 原型和原型链都是来源于对象而服务于对象的概念js中引用类型都是对象,对象就是属性...

  • js基础(三)

    js基础 原型链和原型对象 ... ... js没有继承原型对象prototype通常用来添加公共的属性或行为且只...

  • 发现•分享—2019-01-17

    文章 JS JS 异步编程六种方案 JS基础—原型对象的那些事(一) JS基础—原型对象的那些事(二) CSS 综...

  • JS基础

    JS基础 JS运算 JS代码块 JS对象 原型对象 GC 正则表达式

网友评论

      本文标题:关于JS原型对象

      本文链接:https://www.haomeiwen.com/subject/xibhlxtx.html