2010-11-10 68 views
5

即使我已经阅读了很多关于它的文章,但我无法理解原型概念。Javascript中的原型

为什么会出现StringString.prototype

如果我有"cat"

  • 那是一个StringObject
  • 它是否继承StringString.prototype的所有属性/方法?
  • 为什么会出现StringString.prototype
  • 我应该调用String的String对象和String.prototype的String原型吗?

请澄清这一点。

回答

10

我回答这个问题,因为有误传的主题很多

是这样一个字符串或一个对象?

没有"cat"原始字符串值

typeof "cat"; // "string", a String value 
"cat" instanceof String; // false 


typeof new String("cat"); // "object", a String object 
new String("cat") instanceof String; // true 

稍后我会谈论类型和原始值。

它是继承String还是String.prototype的所有属性/方法?

那么,当您使用property accessor operator(圆点或括号符号),原始值被隐式转换为对象,在内部,因此,所有的上String.prototype的方法是可用的,例如:

当您可以访问:

"cat".chatAt(0); 

场景"cat"转换为对象后面:

Object("cat").chatAt(0); 

这就是为什么你有权访问所有值的继承属性。

为什么会出现String和String.prototype?

String是一个构造函数,允许你创建String对象或做类型转换:

var stringObj = new String("foo"); // String object 

// Type conversion 
var myObj = { toString: function() { return "foo!"; } }; 

alert(String(myObj)); // "foo!" 

String.prototype对象,就是String对象实例继承的对象。

我知道这很让人困惑,我们有String值和String对象,但是大多数时候你只用字符串值工作,现在不用担心String对象。

我应该调用String的String对象和String.prototype的String原型吗?

您应该致电String"The String constructor"

“String prototype”没问题。

你应该知道“一切都是不是一个对象”。

讲起类型,有五个language types规定:

  • 字符串
  • 布尔
  • 未定义

A primitive value是“直接在语言实现的最低级别表示的数据”,这是您可以获得的最简单的信息。

先前描述的类型的值可以是:

  • 空:该值null
  • 未定义:值undefined
  • 数字:所有数字,如0,3.1416,1000等。还有NaNInfinity
  • 布尔值:值truefalse
  • 字符串:每个字符串,如"cat""bar"
+0

我同意你与“字符串”和新的String()的区别,我承认我不知道这一点。但我不同意数据和对象的部分。也许字符串,布尔值和数字不是对象,但它们被表示为JS中的对象,并且如果您执行类似于String instanceof Object的操作,则结果为true。 – mck89 2010-11-10 09:03:18

+0

@ mck89,我的意思是一个原始值是最简单的数据片段,是的,你可以“将它们当作对象”(例如,访问继承的属性,''foo“.chatAt'或'5 .. toFixed'),但它们仍然只是那个值,而不是对象。关于'String instanceof Object'很明显,因为'String'是一个Function对象*,它继承自'Function.prototype',它继承自'Object.prototype',因此'String instanceof Function'也会给你'true '。 – CMS 2010-11-10 09:18:13

3

字符串是JavaScript中的对象。没有像PHP,C或其他语言那样的称为字符串的真正的数据类型。

String.prototype是一个构造函数,用于为所有String对象添加功能。如果你希望所有字符串提供例如转换功能,你做到以下几点:

String.prototype.convert = function() { 
    // Put your code in here 
} 

// Set up y new String 
var example = "cat"; 

// Now you can call your function 
example.convert(); 
+1

这是不对的,JavaScript有一个String类型,''cat''是一个[**原始值**](http://bclary.com/2004/11/07/#a-4.3。 2)。 JavaScript也可以有* String对象*,但概念不同,它们只是简单的包装原语,例如'alert(typeof“foo”); //“string”','alert(typeof Object(“cat”))//“object”'。检查[我的答案](http://stackoverflow.com/questions/4142230/prototypes-in-javascript/4142624#4142624)。 – CMS 2010-11-10 08:58:12