js基础(原型)

 

function fun(){
          alert(this.name);
};
function Person(name , age , gender){
          this.name = name;
          this.age = age;
          this.gender = gender;
          //向对象中添加一个方法
          this.sayName = fun;
 }

//每次创建对象都会新建一个sayName方法,而且是不一样的,这样完全没有必要,可以所有的对象共享同一个方法

//将sayName方法定义在全局中,污染了全局的作用域的命名空间,而且定义在全局作用域中也不安全

 

 

我们创建的每一个函数,解析器都会向函数添加一个属性prototype,这个属性对应一个对象,这个对象就是我们的原型对象

如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用,它所创建的对象都会有一个隐含的属性,指向该构造函数的原型对象,可以通过__proto__来访问属性

原型对象就相当于一个公共区域,所有同一个类的实例都可以访问这个原型对象,我们可以将对象中公共的内容设置到原型对象中

当我们访问对象的一个属性或者方法时候,它会在对象自身中寻找,如果有则直接使用,如果没有,则会去原型对象中寻找,如果找到则使用

创建构造函数时候,可以将这些对象共有的属性或者方法,统一添加到构造函数的原型对象中,使每个对象都具有这些属性和方法

function Person(name , age , gender){
          this.name = name;
          this.age = age;
          this.gender = gender;
          //向对象中添加一个方法
          //this.sayName = fun;
 }

var person = new Person();
console.log(person.__proto__); //{constructor: ?}
console.log(Person.prototype); //{constructor: ?}
console.log(person.__proto__ == Person.prototype); //true
// person.sayName();//报错
Person.prototype.sayName = function (argument) {
          alert("success");
}

var obj = new Person();
//obj.sayName();
console.log(obj);
console.log("sayName" in obj);//true
console.log(obj.hasOwnProperty("name"));//true
console.log(obj.hasOwnProperty("hasOwnProperty"));//false
console.log(obj.__proto__.hasOwnProperty("hasOwnProperty"));//false
console.log(obj.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));//true

原型对象也是对象,所以它也有原型

当我们使用一个对象的属性或者方法的时候,会在自身中寻找,如果没有则去原型中寻找,如果没有则到原型的原型去寻找,直到Object对象,则返回undefined

 

当直接在页面打印一个对象时候,实际上输出的是该对象的toString()方法的返回值,可以添加一个toString()

        function Person(name, age) {
                    // body...
                    this.name = name;
                    this.age = age;
          }

          Person.prototype.toString = function(){
                    return "Person[name=‘"+this.name+", age = "+this.age+"‘]";
          }
          var person = new Person("Tom", 78);
          person.toString = function(argument) {
                    return this.name + "====" + this.age;
          }
          console.log(person);
          console.log(new Person());

垃圾回收:

当一个对象没有任何的变量或者属性对它进行引用的时候,此时我们将无法操作该对象,此时的对象就是一个垃圾

js中有自动的垃圾回收机制,会自动将这些垃圾进行销毁,因此我们不需要进行垃圾回收,我们要做的就是将不再使用的对象赋值为null

  

 

    

原文地址:https://www.cnblogs.com/lzb0803/p/9016764.html

时间: 2024-10-09 05:21:52

js基础(原型)的相关文章

面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式

什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下来将为大家讲解在JS中面向对象的实现. 工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象.其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可. function createBlog(

【 js 基础 】Javascript “继承”

是时候写一写 "继承"了,为什么加引号,因为当你阅读完这篇文章,你会知道,说是 继承 其实是不准确的. 一.类1.传统的面向类的语言中的类:类/继承 描述了一种代码的组织结构形式.举个例子:"汽车"可以被看作是"交通工具"的一种特例.我们可以定义一个 Vehicle 类和一个 Car 类来对这种关系进行描述.Vehicle 的定义可能包含引擎.载人能力等,也就是 所有交通工具,比如飞机.火车和汽车等都有的通用的功能描述.在对 Car 类进行定义的

js基础知识点收集

js基础知识点收集 js常用基本类型 function show(x) { console.log(typeof(x)); // undefined console.log(typeof(10)); // number console.log(typeof('abc')); // string console.log(typeof(true)); // boolean console.log(typeof([])); // object console.log(typeof(function (

JS基础复习

js基础语法 Netcape js基础语法规范(ECMAScript1,2,3,3.1,5(IE9),6   ES    ES6=es2015) DOM BOM BOM :是由浏览器厂商各自实现的,所以差异比较大 DOM:相关的规范  是由W3C维护的 Node的优势  没有浏览器的兼容性问题 前端项目尽量不要使用ES6,需要考虑兼容性问题 --------------------------------数据类型--------------------------- 1.数据类型分类: 基本数据

day02 css&js 基础

案例1-用div+css重新布局首页 div:块标签, <div></div>span:行内的块标签 <span><span>////////////css:渲染 层叠样式表 格式: 选择器{属性:值;属性1:值1;} 后缀名: .css 独立的css(样式)文件 和html元素的整合★ 方式1:内联样式表 通过标签的style属性设置样式 方式2:内部样式表 在当前页面中使用的样式 通过head标签的style子标签导入 例如: <style>

js基础篇——call/apply、arguments、undefined/null

a.call和apply方法详解 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply([thisObj[,ar

Node.js基础知识杂烩

Node.js基础知识杂烩 这段时间做项目主要做关于服务器的功能点,因此,逐渐开始学习node.js写服务器,总体下来,觉得node比php更好用,写服务前器的速度更快,处理效率更高.注:node并不是专门写服务器的,其实node的出现,将js从web前端的专用语言,变成了一门通用语言.node中有各样的基础模块:比如fs,path,buffer,http,net等模块,此外,node还有各种各样的三方模块,比如写服务器人常用的express,co,koa,seqlize等著名框架,也就是三方模

JS基础知识回顾:ECMAScript的语法(二)

ECMAScript中有五种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String ECMAScript还有一种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的. ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述六种数据类型之一,由于ECMAScript的数据类型具有动态性,因此的确没有再定义其他数据类型的必要了. 监狱ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据

Js的原型理解

Js的原型一直都是新手困惑的东西 原型也是Js强大的功能之一, 在面向对象编程里, 原型是必不可少的环节 我们知道Js有五种基本类型: String, Number, Boolean, undefined和null 还有三种引用类型: Array, Object, Function 而对于array类型, 也有join, reverse, pop, shift等方法供我们调用 类似于这样: let arr = []; 空空的数组,可是为什么会有方法供我们调用呢? 这里就是原型了. 每一个Js对象

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留